多线程下载辅助类实现
来源:互联网 发布:网络公益活动有哪些 编辑:程序博客网 时间:2024/04/30 00:18
如需转载,必须注明转自: http://blog.csdn.net/xiazdong/article/details/7738298
使用声明:
类名: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多线程辅助类CountDownLatch
- Android多线程-------同步辅助类
- OkHttp实现多线程断点续传下载,单例模式下多任务下载管理器,一起抛掉sp,sqlite的辅助吧
- Java多线程之同步辅助类(1)
- 多线程辅助类-CountDownLatch的用法
- Android多线程辅助类之一AynscTask
- Android多线程辅助类之二HandlerThread
- 多线程超时限制执行辅助类
- 多线程同步辅助类——CountDownLatch
- CountDownLatch 多线程同步辅助类用法
- java多线程:12、CyclicBarrier同步辅助类
- java多线程:14、Exchanger同步辅助类
- POJ_2482 Stars in Your Window 扫描线 + 线段树
- jQuery-实现图片投影效果的js插件
- 汇编学习--7.12--总结
- Java语言中没有引用传递,只有值传递。到底对不对?
- java基础题
- 多线程下载辅助类实现
- UIKeyboard键盘相关知识点
- 调用mfc扩展型dll使用对话框
- 盘点Android开发者必备的十大开发工具
- [iPhone高级] 基于XMPP的IOS聊天客户端程序(XMPP服务器架构)
- 入门——Android 获取唯一机器码的代码
- xcode 4.3 不再支持 Window-Based Application 的解决办法
- 24点破解的Java实现
- 访问/phpmyadmin等提示403访问拒绝