生活随笔
收集整理的這篇文章主要介紹了
Java简单多线程断点下载
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用多線程下載文件可以更快完成文件的下載,多線程下載文件之所以快,是因為其搶占的服務器資源多。如:假設服務器同時最多服務100個用戶,在服務器中一條線程對應一個用戶,100條線程在計算機中并非并發執行,而是由CPU劃分時間片輪流執行,如果A應用使用了99條線程下載文件,那么相當于占用了99個用戶的資源,假設一秒內CPU分配給每條線程的平均執行時間是10ms,A應用在服務器中一秒內就得到了990ms的執行時間,而其他應用在一秒內只有10ms的執行時間。就如同一個水龍頭,每秒出水量相等的情況下,放990毫秒的水肯定比放10毫秒的水要多。
?
XML/HTML?代碼復制內容到剪貼板 ????? ?package?cn.mzba.download;?????? ??????? ?import?java.io.File;?????? ?import?java.io.InputStream;?????? ?import?java.io.RandomAccessFile;?????? ?import?java.net.HttpURLConnection;?????? ?import?java.net.URL;?????? ??????? ?public?class?MulThreadDownloader?{?????? ??????? ?????/**?????? ??????*?1、首先獲取網絡上的內容,然后獲取文件的長度,標題。?然后在本地上生成一個同樣大小并且同名的文件。?2、執行線程?????? ??????*?3、線程首先定義一個隨機輸入流,用來下載文件同步寫入本地文件?設置Range從指定的開始位置-結束位置下載文件。?????? ??????*?4、獲取服務器返回的輸入流寫入文件。?????? ??????*??????? ??????*/?????? ?????public?static?void?main(String[]?args)?throws?Exception?{?????? ? ????????String?path?=?"http://www.wo...56c.jpg";?????? ? ????????new?MulThreadDownloader().download(path,?3);?????? ?????????System.in.read();?????? ?????}?????? ??????? ?????public?void?download(String?path,?int?threadsize)?throws?Exception?{?????? ? ????????URL?url?=?new?URL(path);?????? ? ????????HttpURLConnection?conn?=?(HttpURLConnection)?url.openConnection();?????? ? ????????conn.setRequestMethod("GET");?????? ?????????conn.setConnectTimeout(5?*?1000);?????? ? ????????int?length?=?conn.getContentLength();?//?獲取文件長度?????? ? ????????File?localfile?=?new?File(getFileName(path));?????? ? ????????RandomAccessFile?file?=?new?RandomAccessFile(localfile,?"rwd");?????? ? ????????file.setLength(length);?????? ?????????file.close();?????? ?????????//?計算每條線程下載的數據長度?????? ? ????????int?block?=?length?%?threadsize?==?0???length?/?threadsize?:?length?????? ? ????????????????/?threadsize?+?1;?????? ? ????????for?(int?i?=?0;?i?<?threadsize;?i++)?{?????? ? ????????????new?DownLoadThread(i,?url,?block,?localfile).start();?????? ?????????}?????? ?????}?????? ??????? ?????private?final?class?DownLoadThread?extends?Thread?{?????? ??????? ?????????private?int?threadid;?????? ?????????private?URL?url;?????? ?????????private?int?block;?????? ?????????private?File?localfile;?????? ??????? ?????????public?DownLoadThread(int?threadid,?URL?url,?int?block,?File?localfile)?{?????? ? ????????????this.threadid?=?threadid;?????? ? ????????????this.block?=?block;?????? ? ????????????this.url?=?url;?????? ? ????????????this.localfile?=?localfile;?????? ? ????????}?????? ??????? ?????????@Override?????? ?????????public?void?run()?{?????? ? ????????????int?startposition?=?threadid?*?block;?//?從網絡文件的什么位置開始下載數據?????? ? ????????????int?endposition?=?startposition?+?block?-?1;?//?下載到文件的什么位置結束?????? ? ????????????RandomAccessFile?file;?????? ?????????????try?{?????? ? ????????????????file?=?new?RandomAccessFile(localfile,?"rwd");?????? ? ????????????????file.seek(startposition);?????? ? ????????????????HttpURLConnection?conn?=?(HttpURLConnection)?url?????? ? ????????????????????????.openConnection();?????? ?????????????????conn.setRequestMethod("GET");?????? ?????????????????conn.setConnectTimeout(5?*?1000);?????? ? ????????????????conn.setRequestProperty("Range",?"bytes="?+?startposition?+?"-"?????? ? ????????????????????????+?endposition);?????? ? ????????????????InputStream?is?=?conn.getInputStream();?????? ? ????????????????byte[]?buffer?=?new?byte[1024];?????? ? ????????????????int?len?=?0;?????? ? ????????????????while?((len?=?is.read(buffer))?!=?-1)?{?????? ? ????????????????????file.write(buffer,?0,?len);?????? ?????????????????}?????? ?????????????????is.close();?????? ?????????????????file.close();?????? ?????????????????System.out.println("線程id"?+?threadid?+?"已經下載完成");?????? ?????????????}?catch?(Exception?e)?{?????? ?????????????????//?TODO?Auto-generated?catch?block?????? ?????????????????e.printStackTrace();?????? ?????????????}?????? ??????? ?????????????super.run();?????? ?????????}?????? ??????? ?????}?????? ??????? ?????public?static?String?getFileName(String?path)?{?????? ?????????return?path.substring(path.lastIndexOf("/")?+?1);?????? ?????}?????? ?}?? ??
? ? ?本文轉自06peng 51CTO博客,原文鏈接:http://blog.51cto.com/06peng/962470,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的Java简单多线程断点下载的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。