多线程下载辅助类实现
2012-07-12 12:40
387 查看
如需转载,必须注明转自: http://blog.csdn.net/xiazdong/article/details/7738298
使用声明:
类名:MultiThreadDownloadUtil
API:
(1)download(String path,int count);
path:文件URL;
count:线程数量;
[java] view
plaincopy
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;
}
}
}
测试类:
[java] view
plaincopy
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);
}
}
将此文件下载到工程目录后,运行可用;
使用声明:
类名:MultiThreadDownloadUtil
API:
(1)download(String path,int count);
path:文件URL;
count:线程数量;
[java] view
plaincopy
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;
}
}
}
测试类:
[java] view
plaincopy
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);
}
}
将此文件下载到工程目录后,运行可用;
相关文章推荐
- 多线程下载辅助类实现
- 多线程下载辅助类实现
- 多线程下载辅助类实现
- Android使用AsyncTask实现多线程下载的方法
- ios多线程操作(十二)—— 自定义NSOperation实现网络下载后回调
- 使用HttpURLConnection实现多线程下载
- iOS多线程实现多图下载功能
- 实现多线程下载的代码
- 使用greenDao+HttpurlConnection实现多线程断点下载
- iOS开发网络篇―实现大文件的多线程断点下载
- 实现一个多线程断点文件下载工具
- Net/C#: 实现支持断点续传多线程下载2
- Centos安装axel实现多线程下载
- 如何实现多线程下载文件
- [导入]以后就不用迅雷了,在IE中实现多线程高速下载
- 在Http协议下实现多线程断点的下载
- (Android小应用)在Android中实现多线程断点下载(连载一)
- 多线程断点下载的实现
- C#实现多线程下载文件的方法
- 用多线程实现的顺序上传下载