【发布时间】:2011-06-07 17:17:44
【问题描述】:
这几乎看起来很傻,但是关闭 OutputStream 时最可靠的模式是什么?现在我有类似下面的东西,这似乎是 try-catch-finally-overkill:
private void writeContentsToFile(OutputStream ostream, Properties contents) {
try {
contents.store(ostream, "comments");
}
catch (IOException e) {
throw new ResourceException("Failed to write contents", e);
}
finally {
try {
ostream.close();
}
catch (IOException e) { /* what can be done here anyway? */ }
}
}
为什么 close 抛出一个检查异常对我来说仍然是一个谜。我可以创建执行 close/catch 块的包装器方法,但如果已经有像 FileUtil.closeFileAndThrowUncheckedException() 这样的东西,我想使用它。当您有很多具有大量开发人员的小型项目时,这会变得更加有用;一种正确的方法。
【问题讨论】:
-
close() 可能会写入数据。如果例如底层流缓冲数据,close() 将刷新数据 - 这可能会由于写入调用可能失败的原因而失败。(在例如套接字的情况下,close() 可能会发出来自先前之一的失败信号也写电话)
-
考虑使用 Writer 而不是直接使用流。如果您使用为任务量身定制的作家,作家会提供很多便利。例如,当使用
BufferedWriter存储您的属性时将是一个不错的选择。如果您查看源代码,您会看到它会刷新并关闭流,但您仍然需要处理“额外的”IOException。 -
@Paul:我通常会这样做,但我在这种情况下使用了 OutputStream 作为一个简单的例子。
-
在您的最后一次捕获中,您可以
throw new RuntimeException(e)。未选中,您不会隐藏异常。 -
@Raedwald,我已将此问题标记为重新打开。虽然它确实是重复的,但它现在是谷歌上最明显的搜索结果(我不会在这里添加搜索词,否则会加强效果)。答案也很明显已经过时了。我认为应该重新打开这个问题并发布正确答案。
标签: java