package my;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class MultiThreadDownload {
/**
* @param args
*/
public static void main(String[] args) {
String path = "http://blog.liuhongwei.cn/wp-content/uploads/2009/08/java-duke-guitar.png";
try {
new MultiThreadDownload().downLoad(path, 5);
} catch (IOException e) {
e.printStackTrace();
}
}
public void downLoad(String path,int threadSize) throws IOException{
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(6000);
//get the length of file
int fileLength = conn.getContentLength();
//get the name of file
String fileName = path.substring(path.lastIndexOf("/"));
File saveFile = new File(fileName);
RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");
accessFile.setLength(fileLength);
accessFile.close();
int block = (fileLength%threadSize ==0? fileLength/threadSize :(fileLength/threadSize+1));
System.out.println(block);
for(int threadID=0 ; threadID < threadSize ; threadID++){
new DownThread(url, saveFile, threadID, block).start();
}
}
private final class DownThread extends Thread{
private URL url;
private File saveFile;
private int threadID;
private int block;
public DownThread(URL url, File saveFile, int threadID, int block) {
this.url = url;
this.saveFile = saveFile;
this.threadID = threadID;
this.block = block;
}
@Override
public void run() {
try {
//System.out.println("threadID = "+threadID+" 已启动!");
int startPosition = threadID * block;
int endPosition = (threadID +1)* block-1;
RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");
accessFile.seek(startPosition);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(6000);
conn.setRequestProperty("Range", "bytes="+startPosition+"-"+endPosition);
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
bis.mark(startPosition);
System.out.println("threadID = "+threadID+" 已启动!"+startPosition);
byte[] buffer = new byte[1024];
int len = 0;
while((len=bis.read(buffer))!=-1){
accessFile.write(buffer, 0, len);
}
bis.close();
accessFile.close();
//输出信息:
System.out.println("threadID = "+threadID+" 已下载完成!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
java实现多线程下载文件功能,通过线程池管理,实现下载文件速度快,安全。
java实现多线程下载,控制台实时输出下载进度,对于学习多线程与网络有一定的帮助
Java实现多线程下载源代码 很有学习的价值
1. 把每个下载文件切成若干个块...2. HTTP Header里增加Range,如果服务器返回Cotent-Range 说明服务器支持文件定位,可以实现多线程下载 详细看这里 http://blog.csdn.net/maoxiang/archive/2010/04/02/5446293.aspx
使用Java编写的多线程下载程序!! 对才学习Java的初学者肯定会有帮助的!!
一个用JAVA实现多线程下载的应用程序和源代码!
用NetBeans编的一个Java多线程下载程序,这只是一个JAR包,大家可以感受下哈!
java多线程下载器,可以用java实现多线程下载功能
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
利用java技术实现多线程文件传输
刚学完多线程和线程池,以及线程爱好者。 使用场景及目标: 大文件的快速下载,经测试在100M带宽的网络下,下载一个40M的文件,不超过两秒钟,当然还得根据自己电脑的配置来讲。 其他说明: 文件如果特别小,而...
采用apache commons开发包,实现了FTP多线程下载,并有简单的包括进度条的界面,代码的运行:1 把自己的PC配置成FTP服务器(只需下载Serc-U软件)2 建立用户,用户名:zhangyu,密码:123,设置根目录,并拷贝进一些...
java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号 java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号
Java实现多线程,使用Java实现多线程
网上找了份资料,是别人完成的Java实现多线程下载的功能。Java多线程的好处挺多的,可以充分利用CPU的资源,简化编程模型,简化异步事件的处理,使GUI更有效率,节约成本...
本程序实现了多线程下载的功能,对于Java编程爱好者,Java网络编程爱好者、以及学习线程部分的读者都是很好的资料