2010-04-23 87 views
0

使用下面的代碼從互聯網下載rar文件時,下載的文件比實際大。 不確定是什麼原因造成的?Java:使用BufferedInputStream,BufferedOutputStream下載問題

 bis = new BufferedInputStream(urlConn.getInputStream()); 
     bos = new BufferedOutputStream(new FileOutputStream(outputFile)); 

     eventBus.fireEvent(this, new DownloadStartedEvent(item)); 

     int read; 
     byte[] buffer = new byte[2048]; 
     while ((read = bis.read(buffer)) != -1) { 
      bos.write(buffer); 
     } 

     eventBus.fireEvent(this, new DownloadCompletedEvent(item)); 

回答

4

即使read(byte[])操作沒有完全填充它,您在每次寫入時都會向輸出寫入完整緩衝區。

此外,由於您已經讀入byte[],所以緩衝流只是適得其反的開銷。使用帶有單字節read()write()方法的緩衝流。

這是一個更好的模式。

InputStream is = urlConn.getInputStream(); 
try { 
    FileOutputStream os = new FileOutputStream(outputFile); 
    try { 
    byte[] buffer = new byte[2048]; 
    while (true) { 
     int n = is.read(buffer); 
     if (n < 0) 
     break; 
     os.write(buffer, 0, n); 
    } 
    os.flush(); 
    } finally { 
    os.close(); 
    } 
} finally { 
    is.close(); 
} 
2

嘗試使用調用的BufferedOutputStream寫,需要一個長度

bos.write(buffer, 0, read)

2

不要重新發明輪子:(!和調試)使用Jakarta Commons IO庫,它已經實現了這個代碼。具體來看,看看IOUtils.copy()

哦是的,因爲erickson顯示,你需要關閉你的流後使用它們。 IOUtils也有一個方法來做到這一點。

+0

yes流在finally塊中關閉,但爲了簡潔起見沒有粘貼。看看公用事業,非常有趣 – nkr1pt 2010-04-23 19:37:46