本文实例为大家分享了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 ListdownloadList = 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(); } }
代码已经测试可以运行!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。