2013-04-24 84 views
3

嗨我正在下載工具,我發現下載速度太低。我檢查了下載速度看起來很慢。我的代碼如下,使用java優化下載速度

 float fileSize = Float.parseFloat(uc.getHeaderField("Content-Length")); 

     in = new BufferedInputStream(uc.getInputStream()); 

     System.out.println("File size : " + fileSize); 


     fout = new FileOutputStream(settingsForm.downloadDirectoryText.getText() + File.separatorChar + fileName); 
     int BUFFER_SIZE = 10240; 
     byte data[] = new byte[BUFFER_SIZE]; 
     int count = 0; 
     int totalDownloaded = 0; 

     long downloadStartTime = System.currentTimeMillis(); 
     long remainingTime = 0; 



     while ((count = in.read(data, 0, BUFFER_SIZE)) != -1) { 

      totalDownloaded += count; 
      long elapsedTime = System.currentTimeMillis() - downloadStartTime; 

      float speedInBytes = 1000f * totalDownloaded/elapsedTime; 
      float tmpSpeed = speedInBytes; 
      if (tmpSpeed > 1024) { 
       tmpSpeed = tmpSpeed/1024; 
      } 
      if (tmpSpeed > 1024 * 1024) { 
       tmpSpeed = tmpSpeed/(1024 * 1024); 
      } 
      System.out.println("Speed : " + tmpSpeed); 
      System.out.println("Remaining Time : " + (fileSize - totalDownloaded)/speedInBytes + " seconds"); 
      int downloadPercentage = (int) ((totalDownloaded/fileSize) * 100); 

      fout.write(data, 0, count); 
     } 

我發現下載需要90秒,平均下載速度爲60-70kbps。

我給出了一個Free Download Manager的下載鏈接,它將在10秒內下載同一個文件。它可以下載同樣的文件,下載速度可達400kpbs。

爲什麼我不能用很快的速度下載?

我的代碼有什麼問題嗎?

在此先感謝。

+2

FDM使用許多連接,每個連接都下載文件的一部分。你可以嘗試去實現它。 – jlordo 2013-04-24 07:31:08

+0

你可以嘗試減少寫到輸出流的數量嗎?不要使用fout.write(data,0,count);在每個循環迭代中。說10次迭代後,使用更大的緩衝區並寫入一次。 – Lokesh 2013-04-24 07:34:57

回答

3

即使不進行修改,您的代碼運行速度也要比60 KB/s更快。您可以添加一個BufferedWriter,但差異可以忽略不計。使用更快的方法來複制:使用字節緩衝區進行讀取/寫入。當使用read()方法(每個字符讀取字符)時,BufferedReader會提高速度。但是緩衝區的大小可以改善這個過程,我用64 * 1024有很好的效果。

你也可以刪除你的if(tmpSpeed> 1024 ...並替換爲(no'if'這裏需要):

double tmpSpeed = speedInBytes/1024; 

我已經測試了我們的程序在我的機器上從一個HD到另一個,我得到了以下的速度爲1GB的文件:

21057ms 
49797 KB/s >>> 60 KB/s 

這不是你的代碼的問題,緩慢到來來自網絡,嘗試使用來自不同服務器的不同文件等...