这是代码
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()
在你的最终块只是确保密切,例如,当冲洗失败,关闭未在试块调用。
为您的应用程序不关心写入是否成功没有错误,是安全的那么长。 如果应用程序需要处理的写入错误是不是安全的,因为刷新上接近缓冲的数据可能会丢失和错误吞噬。
这是可能的理论,但我不能说我所见过的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);
}
是的,它是安全的使用它,但只针对的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