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;i getDownloadList(){ returndownloadList; } publicvoidsetDownloadList(List downloadList){ 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-count3、TestDownload测试类
publicclassTestDownload{ publicstaticvoidmain(String[]args){ DownloadManagerdownloadManager=newDownloadManager("d:/upload/09018417.zip",5,"http://10.1.2.65:8080/cetvossFront/09018417.zip"); downloadManager.action(); } }代码已经测试可以运行!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。