flushでOutOfMemoryを防ぐ
ファイル出力で大きなサイズのファイルを出力する際にflush
しないとOutOfMemory
になる可能性があります。
flush
はためた情報をファイルに出力します。出力することで今までためてたメモリの情報を解放できます。
close
するときにもflush
されるのですが、ファイルが大きいときはある程度ためて出力するなどするとよいと思います。
プログラムの例です。
File file = new File("c:\\tmp\\test.txt");
try(BufferedWriter bw = new BufferedWriter(new FileWriter(file))){
for(int i = 0; i < 100; i++) {
bw.write("こんにちは");
bw.newLine();
bw.flush();
}
}catch(IOException e){
System.out.println(e);
}
このプログラムでは1行1行出力してますが、 ある程度ためてflushするなどもあるかと思います。
この程度でしたらflushを入れなくても特に問題なく動くかと思いますが、
ファイルサイズが数メガ、数ギガバイトとなった時は、メモリを大量に使うことになります。
bw.write
はメモリ上に蓄えているだけです。flush
で実際にファイルに出しています。
ちなみに、Java7からはtry-with-resourcesを使えて、AutoCloseable
が実装されている場合
try(BufferedWriter bw = new BufferedWriter(new FileWriter(file)))
と書くことで
finally
でclose
を書かなくてもよくなっていますので、どんどん利用しましょう。
ちなみにclose
も書くとこんな感じです。やっぱり長くなりますね~。
File file = new File("c:\\tmp\\test.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(file))
try(BufferedWriter bw = new BufferedWriter(new FileWriter(file))){
for(int i = 0; i < 100; i++) {
bw.write("こんにちは");
bw.newLine();
bw.flush();
}
}catch(IOException e){
System.out.println(e);
}finally {
try {
if(bw != null) {
bw.close();
}
} catch(IOException e) {
e.printStackTrace();
}
}
まとめ
ファイルが大きい場合はflush
を途中ですることでメモリを開放してOutOfMemory
を防ぎましょう。
javaの起動時に-Xmx
などで使うメモリを大きくすることで対応することも可能かと思いますが、
どの程度大きくなるなど不明な場合もありますしflush
するのがよいかと思います。
作成日:2022-06-11 更新日:2022-06-11