プログラムが起動すると、ファイルが開かれ、定期的に書き込まれます。(これはログ ファイルではありません。プログラムの出力の 1 つです。) プログラムの長さに合わせてファイルを使用できるようにする必要がありますが、ファイルを終了するために特に何もする必要はありません。閉じるだけです。
Java でのファイル I/O について、実装AutoCloseable
して try-with-resources ブロックにラップすることになっていることを収集します。ただし、このファイルは存続期間が長く、プログラムの数少ない出力の 1 つであるため、開いたすべてのファイルが try-with-resources ブロックでラップされるように整理するのは難しいと感じています。さらに、トップレベルのクラス (私のmain()
関数がある場所) は、このファイルについて知りません。
これが私のコードです。の欠如に注意してくださいwriter.close()
:
public class WorkRecorder {
public WorkRecorder(String recorderFile) throws FileNotFoundException {
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(recorderFile)));
}
private Writer writer;
public void record(Data data) throws Exception {
// format Data object to match expected file format
// ...
writer.write(event.toString());
writer.write(System.lineSeparator());
writer.flush();
}
}
tl;drリソースが開かれた出力ファイルである場合、実装AutoCloseable
して呼び出す必要writer.close()
がありますか?プログラムが完了するまで閉じる必要はありませんか? JVM と OS (Linux) が自動的にクリーンアップしてくれると想定できますか?
おまけ (?): C#IDisposeable
でもこれに苦労しました。このusing
ブロックは、Java の try-with-resources 構造のように、何かを開いたり、すばやく処理したり、すぐに閉じたりする場合に便利な機能です。しかし、多くの場合、特にファイルの場合、そのリソースへのアクセスがしばらく滞っている場合や、複数のそのようなリソースを管理する必要がある場合はそうではありません。私の質問に対する答えが「常に try-with-resources ブロックを使用する」である場合、私は再び立ち往生します。