在下載大文件的時候,我們往往要使用多線程斷點續傳,保證數據的完整性,首先說多線程,我們要多線程下載一個大文件,就有開啓多個線程,多個connection,既然是一個文件分開幾個線程來下載,那肯定就是一個線程下載一個部分,如果文件的大小是200M, 使用兩個線程下載, 第一個線程下載1-100M, 第二個線程下載101-200M。
我們在請求的header裏面設置
conn.setRequestProperty("Range", "bytes="+startPos+"-"+endPos);
這裏startPos是指從數據端的哪裏開始,endPos是指數據端的結束
根據這樣我們就知道,只要多個線程,按順序指定好開始跟結束,就可以解決下載衝突的問題了。
如何寫文件
byte[] buffer = new byte[1024];
int offset = 0;
RandomAccessFile threadFile = new RandomAccessFile(this.saveFile,"rwd");
threadFile.seek(startPos);
threadFile.write(buffer,0,offset);
從上面代碼可以看出,每個線程找到自己開始寫的位置,就是seek(startPos)
這樣就可以保證數據的完整性,也不會重複寫入了
基本上多線程的原理就是這樣,其實也很簡單
那麼我們接着說斷點續傳,斷點續傳其實也很簡單,原理就是使用數據庫保存上次每個線程下載的位置和長度
例如我開了兩個線程T1,T2來下載一個文件,設文件總大小爲1024M,那麼就是每個線程下載512M
可是我的下載中斷了,那麼我下次啓動線程的時候(繼續下載),是不是應該要知道,我原來下載了多少呢
所以是這樣的,每下載一點,就更新數據庫的數據,