2013-08-06 32 views
2

我正在編寫一個Java代碼,使用http協議在網站上下載大量的zip文件,每個文件大小約爲1MB(1024KB)。使用java下載現場文件的最快方法

我知道有很多方法可以做到這一點。我只是漫遊這是最快的,我想知道每個下載的進度,如顯示百分比數字或其他東西。

我只是給我的代碼版本,關於如何改進它的任何想法?

謝謝所有。

public static void downloadFile(String downloadUrl , String fileName) throws Exception { 
    URL url=new URL(downloadUrl); 
    URLConnection connection = url.openConnection(); 
    int filesize = connection.getContentLength(); 
    float totalDataRead=0; 
    java.io.BufferedInputStream in = new java.io.BufferedInputStream(connection.getInputStream()); 
    java.io.FileOutputStream fos = new java.io.FileOutputStream(fileName); 
    java.io.BufferedOutputStream bout = new BufferedOutputStream(fos,1024); 
    byte[] data = new byte[1024]; 
    int i=0; 
    while((i=in.read(data,0,1024))>=0) { 
     totalDataRead=totalDataRead+i; 
     bout.write(data,0,i); 
     float Percent=(totalDataRead*100)/filesize; 
     System.out.println((int)Percent); 
    }  
    bout.close(); 
    in.close(); 
} 
+0

在http://codereview.stackexchange.com/上提出這種問題類型 – rahulserver

+3

除非您有一個專用的1 Gb鏈接到互聯網,否則在代碼中如何做並不重要。即瓶頸不是您的代碼。您可以做出的主要改進是確保您使用的所有帶寬均超過您公平分配的帶寬。我會考慮使用至少1.5 KB的緩衝區,因爲這是數據包大小。例如嘗試2 KB –

+0

謝謝,知道了~~ – xuqin1019

回答

5

您正在過早進行優化。網絡帶寬瓶頸可能遠遠超過您正在進行的任何處理。

您不需要將InputStream包裝在BufferedInputStream中。您可以希望有利於更大的讀取緩衝區的大小,但可能具有最小的影響取決於由連接,內核級的緩衝返回的InputStream的底層實現,等等

對於一個進度條,採取什麼樣的你」到目前爲止已經閱讀並且通過connection.getContentLength()來劃分它,但是請注意,如果長度未知(它只是給出Content-length頭的值),則getContentLength()可能返回-1。在您讀取數據時,將進度信息傳遞給您選擇執行的任何操作以將其顯示給用戶。

+0

感謝您的明確答案。我完全同意你的看法,帶寬是主要的瓶頸。所以有沒有開源的庫可以比自己寫的更好,也許我可以使用它。 – xuqin1019

+2

@ xuqin1019你可以使用Apache commons IO,它會爲你節省幾行代碼(但是增加一個庫) –

+0

謝謝,試試看 – xuqin1019

-4

我不知道,我花了8個小時。爲了減少它從24小時,我取消了所有其他下載,沒有使用互聯網,並殺死了所有其他後臺任務。