2012-02-24 20 views
5

BufferedInputStream & BufferedOutputStreamを使用して大きなファイル(100 MB以上)を読み書きしようとしています。ヒープメモリの問題が発生しました& OOMの例外です。
コードのようになります。私たちはBufferedOutputStreeamを使用するときに私の質問がある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();   

は、それが完全なファイルまでのメモリを保持するが書き出されるのですか?
BufferedOutputStreamを使用して大きなファイルを書き込む最も良い方法は何ですか?

+0

ループ内でフラッシュを試してください。 –

+0

フラッシュするまでバッファリングしています。 whileループでそれをフラッシュします。 –

+2

@jcomeau_ictx - いいえ、BufferedOutputStreamは、フラッシュするまでバッファーされません。内部バッファーのサイズは固定されています。 – jtahlborn

答えて

5

あなたが提供したコードに間違いはありません。あなたの記憶の問題はどこかにあるはずです。バッファリングされたストリームには固定メモリ使用制限があります。

もちろん、OOMEの原因を特定する最も簡単な方法は、OOMEにヒープダンプを生成させ、そのヒープダンプをメモリプロファイラで調べることです。

+0

これは正しいです。しかし、コードに問題があります。buffOut.write()は、書き込むバイト数より少ないバイト数を書き込む可能性があります。その場合は、使用可能なバイトをすべて書き込むまで書き込みを続ける必要があります。 – Bill

+1

@Bill - いいえ、それは真実ではありません。 'write()'は常にすべてのバイトを書き込みます(戻り値はありません)。 – jtahlborn

+0

このコードを多くのスレッドで同時に実行していますか?これがメモリ不足の原因となっているのはかなり難しいです。 –

関連する問題