热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

java多线程实现文件下载

这篇文章主要为大家详细介绍了java多线程实现文件下载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java多线程实现文件下载的具体代码,供大家参考,具体内容如下

1、DownloadManager类

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
 
public class DownloadManager implements Runnable {
 // 保存路径
 private String savePath;
 // 总的下载线程数
 private int threadNum;
 // 下载的链接地址
 private String urlFile;
 // 是否下载开始
 private boolean isStarted;
 // 用于监视何时合并文件存放Thread的list
 private List downloadList = new ArrayList();
 
 public DownloadManager(String savePath, int threadNum, String urlFile) {
 super();
 this.savePath = savePath;
 this.threadNum = threadNum;
 this.urlFile = urlFile;
 }
 
 // 最终调用线程下载。本线程中调用分线程。
 public void action() {
 new Thread(this).start();
 }
 
 public void run() {
 long t1 = System.currentTimeMillis();
 System.out.println(t1);
 // 如果没有下载 , 就开始 , 并且将已经下载的变量值设为true
 if (!isStarted) {
 startDownload();
 isStarted = true;
 }
 while (true) {
 // 初始化认为所有线程下载完成,逐个检查
 boolean finish = true;
 // 如果有任何一个没完成,说明下载没完成,不能合并文件
 for (DownloadThread thread : downloadList) {
 if (!thread.isFinish()) {
 finish = false;
 break;
 }
 }
 // 全部下载完成才为真
 if (finish) {
 // 合并文件
 mergeFiles();
 // 跳出循环 , 下载结束
 break;
 }
 // 休息一会 , 减少cpu消耗
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 }
 long t2 = System.currentTimeMillis();
 System.out.println(t2);
 System.out.println("下载用时:" + (t2 -t1));
 }
 
 public void startDownload() {
 // 得到每个线程开始值 , 下载字节数大小
 int[][] posAndLength = getPosAndLength();
 // 根据下载信息创建每个下载线程,并且启动他们。
 for (int i = 0; i  getDownloadList() {
 return downloadList;
 }
 
 public void setDownloadList(List downloadList) {
 this.downloadList = downloadList;
 }
}

 2、DownloadThread类

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
 
public class DownloadThread implements Runnable {
 // 当前第几个线程 , 用于给下载文件起名 file1 file2 file3 ...
 private int whichThread;
 // 监听单一线程下载是否完成
 private boolean isFinish;
 // 本线程要下载的文件字节数
 private int length;
 // 本线程向服务器发送请求时输入流的首位置
 private int startPosition;
 // 保存的路径
 private String savePath;
 // 要下载的文件 , 用于创建连接
 private String url;
 
 public void run() {
 HttpURLConnection cOnn= null;
 InputStream in = null;
 OutputStream out = null;
 try {
 System.out.println("正在执行的线程:" + whichThread);
 URL fileUrl = new URL(url);
 // 与服务器创建连接
 cOnn= (HttpURLConnection) fileUrl.openConnection();
 // 下载使用get请求
 conn.setRequestMethod("GET");
 // 告诉服务器 , 我是火狐 , 不要不让我下载。
 conn.setRequestProperty(
 "User-Agent",
 "Firefox Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3");
 // 这里是设置文件输入流的首位置
 conn.setRequestProperty("Range", "bytes=" + startPosition + "-");
 // 与服务器创建连接
 conn.connect();
 // 获得输入流
 in = conn.getInputStream();
 // 在硬盘上创建file1 , file2 , ...这样的文件 , 准备往里面写东西
 out = new FileOutputStream(savePath + whichThread);
 // 用于写入的字节数组
 byte[] bytes = new byte[4096];
 // 一共下载了多少字节
 int count = 0;
 // 单次读取的字节数
 int read = 0;
 while ((read = in.read(bytes)) != -1) {
 // 检查一下是不是下载到了本线程需要的长度
 if (length - count 

3、TestDownload测试类

public class TestDownload {
 
 public static void main(String[] args) {
 DownloadManager downloadManager = new DownloadManager("d:/upload/09018417.zip" , 5 , "http://10.1.2.65:8080/cetvossFront/09018417.zip");
 downloadManager.action();
 }
}

代码已经测试可以运行!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
author-avatar
贪婪黑夜面_780
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有