版權聲明:本文為部落客原創文章,轉載請标明出處。 https://blog.csdn.net/chaoyu168/article/details/78057591
什麼是多線程下載下傳?
多線程下載下傳其實就是迅雷,BT一些下載下傳原理,通過多個線程同時和伺服器連接配接,那麼你就可以榨取到較高的帶寬了,大緻做法是将檔案切割成N塊,每塊交給單獨一個線程去下載下傳,各自下載下傳完成後将檔案塊組合成一個檔案,程式上要完成做切割群組裝的小算法。
多線程下載下傳檔案的過程是:
(1)首先獲得下載下傳檔案的長度,然後設定本地檔案的長度。
HttpURLConnection.getContentLength();//擷取下載下傳檔案的長度
RandomAccessFile file = new RandomAccessFile("QQWubiSetup.exe","rwd");
file.setLength(filesize);//設定本地檔案的長度
(2)根據檔案長度和線程數計算每條線程下載下傳的資料長度和下載下傳位置。
如:檔案的長度為6M,線程數為3,那麼,每條線程下載下傳的資料長度為2M,每條線程開始下載下傳的位置如下圖所示。
例如10M大小,使用3個線程來下載下傳,
線程下載下傳的資料長度
(10%3 == 0 ? 10/3:10/3+1) ,第1,2個線程下載下傳長度是4M,第三個線程下載下傳長度為2M
下載下傳開始位置:線程id*每條線程下載下傳的資料長度
= ?
下載下傳結束位置:(線程id+1)*每條線程下載下傳的資料長度-1=?
(3)使用Http的Range頭字段指定每條線程從檔案的什麼位置開始下載下傳,下載下傳到什麼位置為止,
如:指定從檔案的2M位置開始下載下傳,下載下傳到位置(4M-1byte)為止
代碼如下:HttpURLConnection.setRequestProperty("Range",
"bytes=2097152-4194303");
(4)儲存檔案,使用RandomAccessFile類指定每條線程從本地檔案的什麼位置開始寫入資料。
RandomAccessFile threadfile =
new RandomAccessFile("QQWubiSetup.exe ","rwd");
threadfile.seek(2097152);//從檔案的什麼位置開始寫入資料
代碼實作附上大神寫的:
http://www.jb51.net/article/104456.htm http://blog.csdn.net/u013626215/article/details/51281190 https://github.com/duzechao/OKHttpUtils https://github.com/duzechao/DownloadManager推薦這個OKGO架構,完美實作:
https://github.com/jeasonlzy/okhttp-OkGo