簡體   English   中英

Java中的多線程下載器

[英]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();
}

謝謝您的期待。

RandomAccessFile不是線程安全的。

raf.seek(begin)失敗,請參見RandomAccessFile.seek()的文檔

設置文件指針偏移量,從該文件的開頭開始測量,在該位置下一次讀取或寫入。 偏移量可以設置為超出文件末尾。 將偏移量設置為超出文件末尾不會更改文件長度。 僅在設置偏移量超出文件末尾之后,才通過寫入來更改文件長度。

您可以將文件的一部分下載到單獨的文件中,然后合並它們。

您確定並行下載速度更快嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM