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. }  

相关文章推荐

Android Java 多线程下载文件 demo

  • 2016年10月25日 13:07
  • 47.14MB
  • 下载

Java多线程文件下载

  • 2014年06月29日 14:46
  • 9KB
  • 下载

【java编程】IO特殊类之RandomAccessFile实现多线程文件下载

RandomAccessFile特点: 1.它不是IO流的子类,而是直接继承至Object类。但内部实现的是DataInputStream和OutputStream来实现读写 2.从构造函数可以看出,...
  • KFCKA
  • KFCKA
  • 2015年03月18日 12:02
  • 652

Java多线程设计模式上传文件

  • 2008年09月14日 16:37
  • 386KB
  • 下载

Java带进度多线程下载文件

前面讲了基本的IO,但是实际的项目中,文件大了之后一般会使用多线程来进行处理。本文主要是使用多线程对文件进行下载,并提供了进度显示。在实现的过程中遇到了很多小问题,都是因为知识点不熟,查阅了官方文档之...

最新---java多线程下载文件

import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; impo...

Java 文件多线程下载

自己写了一个文件
  • FX_SKY
  • FX_SKY
  • 2014年08月28日 10:10
  • 1009

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

package com.zkq.dowload; import java.io.File; import java.io.InputStream; import java.io.RandomAcce...

在Java中使用多线程结合断点续传实现一个简单的文件下载器

这篇博客介绍在android中使用多线程和断点续传实现一个简单的文件下载器 第一步:启动Tomcat服务器,将需要下载的文件部署到Tomcat服务器上 第二步:使用eclipse创建一个J...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java多线程下载文件
举报原因:
原因补充:

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