多线程下载辅助类实现
2012-07-11 22:49
274 查看
如需转载,必须注明转自: http://blog.csdn.net/xiazdong/article/details/7738298
使用声明:
类名:MultiThreadDownloadUtil
API:
(1)download(String path,int count);
path:文件URL;
count:线程数量;
测试类:
将此文件下载到工程目录后,运行可用;
使用声明:
类名:MultiThreadDownloadUtil
API:
(1)download(String path,int count);
path:文件URL;
count:线程数量;
package org.xiazdong.multidownload.util; import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class MultiThreadDownloadUtil{ private static int filesize; private static int block; private static String filename; private static int downloadsize; private class MyThread extends Thread{ private int i; //线程ID private String path; //下载文件的URL public MyThread(int i, String path) { this.i = i; this.path = path; downloadsize = 0; } @Override public void run() { try{ System.out.println("线程"+(i+1)+"开始下载"); //1.打开文件,并定位位置 RandomAccessFile raf = new RandomAccessFile(new File(filename), "rwd"); raf.seek(i*block); //定位到此线程要负责下载的位置 int start = i*block; int end = (i+1)*block-1; //2.连接服务器 URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("range", "bytes="+start+"-"+end); //发出请求头 if(conn.getResponseCode()==206){ //注意:分段下载的返回码为206,而不是200 InputStream in = conn.getInputStream(); int length = 0; byte[]data = new byte[1024]; while((length=in.read(data))!=-1){ raf.write(data,0,length); //写入本地文件 } } //显示下载进度 downloadsize += (end-start); System.out.println("已下载"+downloadsize/1024.0+"k,共"+filesize/1024.0+"k"); //3.关闭文件 raf.close(); System.out.println("线程"+(i+1)+"结束下载..."); } catch(Exception e){ e.printStackTrace(); } } } /** * 下载文件 * @param path URL * @param threadcount 线程数 * @throws Exception */ public static void download(String path,int threadcount) throws Exception{ filename = path.substring(path.lastIndexOf('/')+1); filesize = getFileSize(path); block = getBlockSize(filesize,threadcount); createLocalRandomFile(filesize); MultiThreadDownloadUtil mdu = new MultiThreadDownloadUtil(); for(int i=0;i<threadcount;i++){ mdu.new MyThread(i,path).start(); } } /** * 创建一个本地文件,并设置文件的大小 * @param filesize * @throws Exception */ private static void createLocalRandomFile(int filesize) throws Exception { RandomAccessFile raf = new RandomAccessFile(new File(filename), "rwd"); raf.setLength(filesize); raf.close(); } /** * 根据文件总大小和线程数求出每个线程要下载的数据量 * @param filesize * @param threadcount * @return */ private static int getBlockSize(int filesize, int threadcount) { return filesize%threadcount==0?filesize/threadcount:(filesize/threadcount+1); } /** * 求出文件总大小 * @param path * @return * @throws Exception */ private static int getFileSize(String path) throws Exception{ URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("GET"); if(conn.getResponseCode()==200){ return conn.getContentLength(); } else{ return 0; } } }
测试类:
package org.xiazdong.download; import org.xiazdong.multidownload.util.MultiThreadDownloadUtil; public class MultiThreadDownloader { public static void main(String[] args) throws Exception { int threadCount = 3; //指定线程数量 String path = "http://dlc2.pconline.com.cn/filedown_61761_6694063/drivethelife2010_pconline_setup.exe"; //指定下载文件路径 MultiThreadDownloadUtil.download(path, threadCount); } }
将此文件下载到工程目录后,运行可用;
相关文章推荐
- 多线程下载辅助类实现
- 多线程下载辅助类实现
- 多线程下载辅助类实现
- 使用java实现http多线程断点下载文件(一)
- 优雅设计封装基于Okhttp3的网络框架(三):多线程下载功能核心实现 及 线程池、队列机制、终止线程解析
- Asp.net(c#)实现多线程断点下载
- 实现支持断点续传多线程下载的 Http Web 客户端工具类
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类
- 主题:以多线程、断点续传方式下载文件的实现
- Java实现多线程断点下载
- Android实现网络多线程文件下载
- C# 多线程辅助类实现多任务
- 发一个多线程通过 HTTP 下载文件的类(Linux下的实现)
- 4.1.2.2 Service 实现多线程的下载
- [收藏]实现支持断点续传多线程下载的 Http Web 客户端工具类 (第2版)
- Python实现多线程下载
- Android 多线程断点下载的实现方法
- Java实现多线程断点下载实例代码(下载过程中可以暂停)
- 实现多线程断点下载可以运行