java多线程下载文件

原创 2015年07月08日 15:32:44
  1. import java.io.File;  
  2. import java.io.InputStream;  
  3. import java.io.RandomAccessFile;  
  4. import java.net.HttpURLConnection;  
  5. import java.net.URL;  
  6.   
  7. public class MulThreadDownload {  
  8.     public static void main(String[] args) throws Exception {  
  9.         String path = "http://192.168.1.100:8080/Hello/Big.exe";  
  10.         new MulThreadDownload().download(path, 3);  
  11.     }  
  12.   
  13.     /** 
  14.      * 下载文件 
  15.      *  
  16.      * @param path 
  17.      *            网络文件路径 
  18.      * @param threadSize 
  19.      *            线程数 
  20.      * @throws Exception 
  21.      */  
  22.     private void download(String path, int threadSize) throws Exception {  
  23.         URL url = new URL(path);  
  24.         HttpURLConnection connection = (HttpURLConnection) url.openConnection();  
  25.         connection.setRequestMethod("GET");  
  26.         connection.setConnectTimeout(5000);  
  27.         if (connection.getResponseCode() == 200) {  
  28.             int length = connection.getContentLength();// 获取网络文件长度  
  29.             File file = new File(getFileName(path));  
  30.             // 在本地生成一个长度与网络文件相同的文件  
  31.             RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");  
  32.             accessFile.setLength(length);  
  33.             accessFile.close();  
  34.   
  35.             // 计算每条线程负责下载的数据量  
  36.             int block = length % threadSize == 0 ? length / threadSize : length  
  37.                     / threadSize + 1;  
  38.             for (int threadId = 0; threadId < threadSize; threadId++) {  
  39.                 new DownloadThread(threadId, block, url, file).start();  
  40.             }  
  41.         } else {  
  42.             System.out.println("download fail");  
  43.         }  
  44.     }  
  45.   
  46.     private class DownloadThread extends Thread {  
  47.   
  48.         private int threadId;  
  49.         private int block;  
  50.         private URL url;  
  51.         private File file;  
  52.   
  53.         public DownloadThread(int threadId, int block, URL url, File file) {  
  54.             this.threadId = threadId;  
  55.             this.block = block;  
  56.             this.url = url;  
  57.             this.file = file;  
  58.         }  
  59.   
  60.         @Override  
  61.         public void run() {  
  62.             int start = threadId * block; // 计算该线程从网络文件什么位置开始下载  
  63.             int end = (threadId + 1) * block - 1// 计算下载到网络文件什么位置结束  
  64.             try {  
  65.                 RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");  
  66.                 accessFile.seek(start);  //从start开始  
  67.   
  68.                 HttpURLConnection connection = (HttpURLConnection) url  
  69.                         .openConnection();  
  70.                 connection.setRequestMethod("GET");  
  71.                 connection.setConnectTimeout(5000);  
  72.                 //设置获取资源数据的范围,从start到end  
  73.                 connection.setRequestProperty("Range""bytes=" + start + "-"  
  74.                         + end);  
  75.                 //注意多线程下载状态码是 206  不是200  
  76.                 if (connection.getResponseCode() == 206) {  
  77.                     InputStream inputStream = connection.getInputStream();  
  78.                     byte[] buffer = new byte[1024];  
  79.                     int len = 0;  
  80.                     while ((len = inputStream.read(buffer)) != -1) {  
  81.                         accessFile.write(buffer, 0, len);  
  82.                     }  
  83.                     accessFile.close();  
  84.                     inputStream.close();  
  85.                 }  
  86.                 System.out.println("第" + (threadId + 1) + "条线程已经下载完成");  
  87.             } catch (Exception e) {  
  88.                 e.printStackTrace();  
  89.             }  
  90.         }  
  91.     }  
  92.   
  93.     /** 
  94.      * 获取文件名称 
  95.      *  
  96.      * @param path 
  97.      *            网络文件路径 
  98.      * @return 
  99.      */  
  100.     private String getFileName(String path) {  
  101.         return path.substring(path.lastIndexOf("/") + 1);  
  102.     }  
  103. }  

Java代码实现多线程下载和断点续传

- 多线程下载原理 客户端要下载一个文件, 首先请求服务器,服务器将这个文件传送给客户端,客户端保存到本地, 完成了一个下载的过程. 多线程下载的思想是客户端开启多个线程同时下载,每个线程只负责下载文...
  • qq_32101859
  • qq_32101859
  • 2016年11月15日 21:10
  • 5044

Java多线程下载文件Demo

原文:http://www.cnblogs.com/warrior4236/p/5686404.html 一:需求分析 1:下载远程资源文件,通过多线程下载,达到高效的目的。 2:使...
  • xlxxybz1314
  • xlxxybz1314
  • 2016年12月21日 22:23
  • 781

java网络---实现多线程下载文件

使用多线程下载:    1:可以记录当前下载当前的位置,实现断点下载。 多线程下载的时候可以记录上次下载的位置,当再次开始的时候可以帮我们记住上次下载的位置,当再次下载的时候可以从记录的位置开始。...
  • WannerWang
  • WannerWang
  • 2015年10月23日 21:45
  • 668

Java多线程文件下载

一. 多线程下载文件考虑处理步骤: 1. 如何获取文件的长度 2. 合理的创建线程数量,并计算每一个线程下载的长度 3. 如何将多个线程下载的字节写入到文件中 二. 代码实现如下: package c...
  • chengzhangmsdn
  • chengzhangmsdn
  • 2015年09月30日 16:10
  • 910

Java HttpClient4 get方式多线程下载文件

1. HttpClient 4 多线程下载文件 利用httpclient4
  • lichao_ustc
  • lichao_ustc
  • 2014年06月13日 14:51
  • 2057

基于HTTP的多线程文件下载功能实现

思想 文件信息获取的获取方式与单线程的方式一样 与单线程相比不同的是将远程文件分块并发获取,然后再并发写入到本地暂存文件中 远程文件分块的实现依据是:connection.setRequestProp...
  • WuZuoDingFeng
  • WuZuoDingFeng
  • 2016年12月08日 19:33
  • 656

java多线程下载文件源码下载

原文:java多线程下载文件源码下载 源代码下载地址:http://www.zuidaima.com/share/1849085342305280.htm 多线程下载源码 ===...
  • yaerfeng
  • yaerfeng
  • 2016年10月27日 09:40
  • 591

实现并发下载(即多线程实现文件下载)

上一篇我们说到了多线程实现文件上传,接下来继续说文件的下载 和上一篇的思路差不多,首先同样是要考虑多线程是对那一端的多线程 因为是多个客户端同时下载服务器端的文件,所以还是对服务器端的多线程 还...
  • daliyuan350649623
  • daliyuan350649623
  • 2016年08月24日 21:32
  • 3607

Java多线程实现下载功能

网上找了份资料,是别人完成的Java实现多线程下载的功能。 Java多线程的好处挺多的,可以充分利用CPU的资源,简化编程模型,简化异步事件的处理,使GUI更有效率,节约成本。 下面是实现多线程下载的...
  • zyujie
  • zyujie
  • 2012年11月22日 11:38
  • 13333

web开发中多线程下载文件

web开发中涉及到多线程下载文件,源代码如下:import java.io.File; import java.io.FileInputStream; import java.io.FileOutpu...
  • xiaopihaierletian
  • xiaopihaierletian
  • 2016年07月01日 15:23
  • 386
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java多线程下载文件
举报原因:
原因补充:

(最多只允许输入30个字)