java多线程实现文件下载
本文实例为大家分享了java多线程实现文件下载的具体代码,供大家参考,具体内容如下
1、DownloadManager类
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.HttpURLConnection;
importjava.net.MalformedURLException;
importjava.net.URL;
importjava.util.ArrayList;
importjava.util.List;
publicclassDownloadManagerimplementsRunnable{
//保存路径
privateStringsavePath;
//总的下载线程数
privateintthreadNum;
//下载的链接地址
privateStringurlFile;
//是否下载开始
privatebooleanisStarted;
//用于监视何时合并文件存放Thread的list
privateListdownloadList=newArrayList();
publicDownloadManager(StringsavePath,intthreadNum,StringurlFile){
super();
this.savePath=savePath;
this.threadNum=threadNum;
this.urlFile=urlFile;
}
//最终调用线程下载。本线程中调用分线程。
publicvoidaction(){
newThread(this).start();
}
publicvoidrun(){
longt1=System.currentTimeMillis();
System.out.println(t1);
//如果没有下载,就开始,并且将已经下载的变量值设为true
if(!isStarted){
startDownload();
isStarted=true;
}
while(true){
//初始化认为所有线程下载完成,逐个检查
booleanfinish=true;
//如果有任何一个没完成,说明下载没完成,不能合并文件
for(DownloadThreadthread:downloadList){
if(!thread.isFinish()){
finish=false;
break;
}
}
//全部下载完成才为真
if(finish){
//合并文件
mergeFiles();
//跳出循环,下载结束
break;
}
//休息一会,减少cpu消耗
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
longt2=System.currentTimeMillis();
System.out.println(t2);
System.out.println("下载用时:"+(t2-t1));
}
publicvoidstartDownload(){
//得到每个线程开始值,下载字节数大小
int[][]posAndLength=getPosAndLength();
//根据下载信息创建每个下载线程,并且启动他们。
for(inti=0;igetDownloadList(){
returndownloadList;
}
publicvoidsetDownloadList(ListdownloadList){
this.downloadList=downloadList;
}
}
2、DownloadThread类
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.HttpURLConnection;
importjava.net.URL;
publicclassDownloadThreadimplementsRunnable{
//当前第几个线程,用于给下载文件起名file1file2file3...
privateintwhichThread;
//监听单一线程下载是否完成
privatebooleanisFinish;
//本线程要下载的文件字节数
privateintlength;
//本线程向服务器发送请求时输入流的首位置
privateintstartPosition;
//保存的路径
privateStringsavePath;
//要下载的文件,用于创建连接
privateStringurl;
publicvoidrun(){
HttpURLConnectionconn=null;
InputStreamin=null;
OutputStreamout=null;
try{
System.out.println("正在执行的线程:"+whichThread);
URLfileUrl=newURL(url);
//与服务器创建连接
conn=(HttpURLConnection)fileUrl.openConnection();
//下载使用get请求
conn.setRequestMethod("GET");
//告诉服务器,我是火狐,不要不让我下载。
conn.setRequestProperty(
"User-Agent",
"FirefoxMozilla/5.0(Windows;U;WindowsNT5.1;zh-CN;rv:1.9.1.3)Gecko/20090824Firefox/3.5.3");
//这里是设置文件输入流的首位置
conn.setRequestProperty("Range","bytes="+startPosition+"-");
//与服务器创建连接
conn.connect();
//获得输入流
in=conn.getInputStream();
//在硬盘上创建file1,file2,...这样的文件,准备往里面写东西
out=newFileOutputStream(savePath+whichThread);
//用于写入的字节数组
byte[]bytes=newbyte[4096];
//一共下载了多少字节
intcount=0;
//单次读取的字节数
intread=0;
while((read=in.read(bytes))!=-1){
//检查一下是不是下载到了本线程需要的长度
if(length-count
3、TestDownload测试类
publicclassTestDownload{
publicstaticvoidmain(String[]args){
DownloadManagerdownloadManager=newDownloadManager("d:/upload/09018417.zip",5,"http://10.1.2.65:8080/cetvossFront/09018417.zip");
downloadManager.action();
}
}
代码已经测试可以运行!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。