へっぽこITエンジニア@名古屋のブログ

Follow me on GitHub

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)))と書くことで finallycloseを書かなくてもよくなっていますので、どんどん利用しましょう。

ちなみに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