38

このコードですか

    BufferedWriter bw = new BufferedWriter(new FileWriter("test.txt"));
    try {
        bw.write("test");
    } finally {
        IOUtils.closeQuietly(bw);
    }

安全かどうか?私が理解している限り、BufferedWriter を閉じると、そのバッファーが基になるストリームにフラッシュされ、エラーが原因で失敗する可能性があります。しかし IOUtils.closeQuietly API は、例外は無視されると言っています。

IOUtils.closeQuietly が原因でデータ損失が見過ごされる可能性はありますか?

4

4 に答える 4

42

の javadoc に関して、コードは次のようになりますcloseQuietly()

BufferedWriter bw = null;

try {
    bw = new BufferedWriter(new FileWriter("test.txt"));
    bw.write("test");
    bw.flush(); // you can omit this if you don't care about errors while flushing
    bw.close(); // you can omit this if you don't care about errors while closing
} catch (IOException e) {
    // error handling (e.g. on flushing)
} finally {
    IOUtils.closeQuietly(bw);
}

closeQuietly()close()Closable を直接呼び出すのではなく、一般的な使用を目的としていません。その意図されたユースケースは、最終ブロック内で確実に閉じることです。必要なすべてのエラー処理は、その前に実行する必要があります。

つまり、close()またはの呼び出し中に例外に反応したい場合flush()は、通常の方法で処理する必要があります。最終ブロックを追加するcloseQuietly()と、フラッシュが失敗し、クローズが try ブロックで呼び出されなかった場合など、確実にクローズされます。

于 2013-01-21T10:57:53.100 に答える
8

書き込みがエラーなしで成功したかどうかをアプリケーションが気にしない限り、安全です。アプリケーションが書き込みエラーを処理する必要がある場合、閉じるときにフラッシュされたバッファリングされたデータが失われ、エラーが飲み込まれる可能性があるため、安全ではありません。

于 2013-01-21T10:46:24.177 に答える
5

理論上は可能ですが、close() が失敗するのを見たことがないとは言えません。通常、フェイル ファストとは、ファイルを開くなどの以前の IO 操作が最初に失敗することを意味します。IOExceptions を無視しない close を書くことはできますが、それが失敗した try/catch ブロック内の何かである場合、これは例外の真の原因を壊す可能性があります。

あなたが望むのは次のようなものです(ほとんどの場合、これはやり過ぎです)

try {
    // write to bw.
    bw.close(); // throw IOException if an error occurs.

} finally {
    // don't clobber a previous IOException
    IOUtils.closeQuietly(bw);
}
于 2013-01-21T10:22:22.500 に答える