它是安全使用Apache公地IO IOUtils.closeQuietly?(Is it safe

2019-07-18 11:36发布

这是代码

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

安全与否? 据我了解,当我们关闭的BufferedWriter将刷新其缓冲区底层流和由于错误可能会失败。 但IOUtils.closeQuietly API表示,任何异常都会被忽略。

是否有可能发生数据丢失会被忽视,由于IOUtils.closeQuietly?

Answer 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()不用于一般用途,而不是调用close()直接对关闭。 它旨在用例是为确保最终区块内关闭 - 所有的错误处理,你需要有这之前完成。

这意味着,如果你想要的通话过程中的异常反应close()flush()那么你已经作出处理的正常方式。 添加closeQuietly()在你的最终块只是确保密切,例如,当冲洗失败,关闭未在试块调用。



Answer 2:

为您的应用程序不关心写入是否成功没有错误,是安全的那么长。 如果应用程序需要处理的写入错误是不是安全的,因为刷新上接近缓冲的数据可能会丢失和错误吞噬。



Answer 3:

这是可能的理论,但我不能说我所见过的close()失败。 通常快速失败意味着上一个IO操作,如打开文件会先失败。 你可以写一个不忽视的IOExceptions密切,但这可能破坏异常的真正原因,如果它是东西在失败try / catch块。

你需要的是类似于下面的东西(这是矫枉过正在大多数情况下)

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

} finally {
    // don't clobber a previous IOException
    IOUtils.closeQuietly(bw);
}


Answer 4:

是的,它是安全的使用它,但只针对的Java6低。 从Java7,你应该用户尝试-与资源 。

这将消除许多你有样板代码,并使用需要的IOUtils.closeQuietly

现在,你比如:

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

可以写成:

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

需要注意的是,为了使用try-与资源的方法,你的资源需要实现一个名为java.lang.AutoCloseable新的界面,在Java 7的推出是非常重要的。

此外,还可以包括在try-与资源块了大量的资源,只是他们有独立的;

   try (
       BufferedWriter bw1 = new BufferedWriter(new FileWriter("test1.txt"));
       BufferedWriter bw2 = new BufferedWriter(new FileWriter("test2.txt"))
   ) {
       // Do something useful with those 2 buffers!
   }   // bw1 and bw2 will be closed in any case


文章来源: Is it safe to use Apache commons-io IOUtils.closeQuietly?