使用Apache commons-io IOUtils.closeQuietly安全吗?

2022-09-01 04:30:19

这是代码吗

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

安全与否?据我所知,当我们关闭 BufferedWriter 时,它会将其缓冲区刷新到基础流,并且可能由于错误而失败。但是IOUtils.closeQuietly API表示,任何异常都将被忽略。

是否有可能由于IOUtils.closeQuietly而导致数据丢失被忽视?


答案 1

关于 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()不适用于一般用途,而不是直接调用 Closable。它的预期用例是确保最终块内的关闭 - 在此之前必须完成所需的所有错误处理。close()

这意味着,如果你想在调用期间对异常做出反应,那么你必须以正常的方式处理它。添加最终块只是确保关闭,例如,当刷新失败并且没有在try-block中调用关闭时。close()flush()closeQuietly()


答案 2

只要您的应用程序不关心写入是否成功而没有错误,它就是安全的。如果您的应用程序需要处理写入错误,则不安全,因为在关闭时刷新的缓冲数据可能会丢失,并且错误会被吞噬。


推荐