1. ホーム
  2. java

[解決済み] Apache commons-io IOUtils.closeQuietlyを使用しても大丈夫でしょうか?

2022-02-09 09:49:52

質問

このコードは

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

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

IOUtils.closeQuietlyによって、データ損失が気づかれない可能性はありますか?

解決方法は?

の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() を直接クローサブルにすることができます。その意図された使用例は、最終ブロックの中でクローズを確実にすることです。

つまり、もしあなたが close() または flush() の場合、通常の方法で処理する必要があります。追加 closeQuietly() は、フラッシュが失敗し、try-block で close が呼ばれなかった場合などに、close を確実にするためのものです。