2012-02-24 47 views
5

我正在嘗試使用BufferedInputStream & BufferedOutputStream讀取和寫入大文件(大於100 MB)。我得到堆內存問題& OOM異常。
代碼如下:使用BufferedOutputStream寫入大文件

BufferedInputStream buffIn = new BufferedInputStream(iStream); 
/** iStream is the InputStream object **/ 

BufferedOutputStream buffOut=new BufferedOutputStream(new FileOutputStream(file)); 
byte []arr = new byte [1024 * 1024]; 
int available = -1; 
while((available = buffIn.read(arr)) > 0) { 
    buffOut.write(arr, 0, available); 
}  
buffOut.flush(); 
buffOut.close();   

我的問題是,當我們使用BufferedOutputStreeam是它收容了存儲,直到整個文件被寫入了呢?
使用BufferedOutputStream編寫大文件的最佳方法是什麼?

+0

嘗試在循環內部沖洗 – 2012-02-24 04:23:53

+0

它緩衝,直到你刷新它。在while循環中刷新它。 – 2012-02-24 04:24:32

+2

@jcomeau_ictx - no,BufferedOutputStream在刷新之前不會緩衝,它有一個固定的內部緩衝區大小。喝酒時不應張貼 – jtahlborn 2012-02-24 04:46:18

回答

5

您提供的代碼沒有任何問題。你的記憶問題必須在別處。緩衝流具有固定的內存使用限制。

確定導致OOME的最簡單方法當然是讓OOME生成一個堆轉儲,然後檢查內存分析器中的堆轉儲。

+0

這是正確的。但是,代碼存在問題,buffOut.write()寫入的字節數可能會少於寫入的字節數,在這種情況下,您需要繼續寫入,直到寫入所有可用字節。 – Bill 2012-02-24 04:47:36

+1

@Bill - 不,那是不正確的。 write()總是寫所有的字節(它沒有返回值)。 – jtahlborn 2012-02-24 05:07:21

+0

你是否在多個線程中同時運行此代碼?很難看到這是你的內存不足錯誤的根源。 – 2012-02-24 06:34:57