0

プログラムが起動すると、ファイルが開かれ、定期的に書き込まれます。(これはログ ファイルではありません。プログラムの出力の 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 ブロックを使用する」である場合、私は再び立ち往生します。

4

3 に答える 3

0

Java のガベージ コレクターが取得できるように、常にリソースを閉じるか null に設定する必要があります。try-with-resource ブロックの使用は、リソースの使用が終了したときに Java が自動的にリソースを閉じるようにするための優れた方法です。プログラムの実行中に使用したとしても、最後に閉じておくことをお勧めします。必要ないと言う人もいるかもしれませんが、個人的には、とにかくやってみようと思います。その理由は次のとおりです。

「ストリームが不要になった場合は、必ず close() メソッドを使用して閉じるか、try-with resource ステートメントを使用して自動的に閉じてください。ストリームを閉じないと、出力ファイルのデータが破損したり、その他のプログラミング エラーが発生したりする可能性があります。

- Java プログラミング入門、第 10 版、Y. Daniel Liang

可能であれば、プログラムの最後でリソースに対して .close() メソッドを実行するだけです。

于 2016-02-26T18:33:48.767 に答える
0

try-with-resources ステートメントでラップするのに適していない同様のコードがあります。プログラムが終了したら閉じる限り、それで問題ないと思います。

発生する可能性のあることを考慮してくださいExceptions。たとえば、私のプログラムにはcleanup()、プログラムがシャットダウンされたときに呼び出されるメソッドがあります。これは を呼び出しますwriter.close()。これは、プログラムのシャットダウンを引き起こす異常な動作がある場合にも呼び出されます。

これが単純なプログラムであり、Writerその期間中は開いていることを期待している場合、プログラムが終了したときに閉じられないことは大したことではないと思います...しかし、それ良い習慣ですリソースが閉じていることを確認してください。そのため、プログラムがシャットダウンする可能性がある場所にそれを追加します。

于 2016-02-26T18:29:24.233 に答える
0

私は(今)より良い答えは「場合による」だと思います:-)。詳細な処理は、Lukas Eder によって提供されていますLambda EG グループの投稿もチェックしてください。

しかし、一般的には、使い終わったらリソースをオペレーティング システムに戻し、try-with-resources常に使用することをお勧めします (自分が何をしているのかを知っている場合を除く)。

于 2016-02-26T20:55:07.340 に答える