[英]multi threaded downloader in java
好的,我正在使用以下功能創建多個線程來下載文件。 您可以看到函數以鏈接,開始字節,結束字節以及下載文件的路徑作為參數。 我調用此函數兩次,以創建兩個線程來下載所需的文件。
例如,如果文件為100字節,請執行以下操作
線程1-> DownloadFile(“ http://localhost/file.zip ”,0,50,“ output.zip”);
線程2-> DownloadFile(“ http://localhost/file.zip ”,50,100,“ output.zip”);
但是您知道會發生什么,只有幾個字節沒有下載,並且進度條卡在了99%上。 那就是問題所在!!!
為什么會卡在99%? 換句話說,為什么有些字節丟失了? 我可以在下載的變量中看到字節總數。
這是功能
public void DownloadFile(final String link, final long start,final long end, final String path){
new Thread(new Runnable(){
public void run(){
try {
URL url = new URL(link);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Range", "bytes="+start+"-"+end);
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
RandomAccessFile raf = new RandomAccessFile(path,"rw");
raf.seek(start);
int i=0;
byte bytes[] = new byte[1024];
while((i = bis.read(bytes))!=-1){
raf.write(bytes, 0, i);
downloaded = downloaded+i;
int perc = (int) ((downloaded*100)/FileSize);
progress.setValue(perc);
percentLabel.setText(Long.toString(downloaded)+" out of "+FileSize);
}
if(FileSize==downloaded){
progress.setValue(100);
JOptionPane.showMessageDialog(null, "Download Success! ");
progress.setValue(0);
downloaded=0;
downBtn.setText("Download");
}
bis.close();
raf.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
謝謝您的期待。
raf.seek(begin)
失敗,請參見RandomAccessFile.seek()的文檔
設置文件指針偏移量,從該文件的開頭開始測量,在該位置下一次讀取或寫入。 偏移量可以設置為超出文件末尾。 將偏移量設置為超出文件末尾不會更改文件長度。 僅在設置偏移量超出文件末尾之后,才通過寫入來更改文件長度。
您可以將文件的一部分下載到單獨的文件中,然后合並它們。
您確定並行下載速度更快嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.