该问题及其大部分答案可以追溯到Java 7发行之前。Java7 提供了自动资源管理功能来实现此目的。如果您使用的是Java 7或更高版本,则应参考Ross Johnson的答案。
什么是关闭Java中嵌套流的最佳,最全面的方法?例如,考虑设置:
FileOutputStream fos = new FileOutputStream(...)
BufferedOS bos = new BufferedOS(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
我知道需要对close操作进行保险(可能通过使用finally子句)。我想知道的是,是否有必要明确确保嵌套流已关闭,还是足以确保关闭外部流(oos)?
我注意到的一件事,至少是在处理此特定示例时,发现内部流似乎仅抛出FileNotFoundExceptions。这似乎暗示着从技术上讲,如果它们失败了,就不必担心将其关闭。
这是一位同事写的:
从技术上讲,如果正确实施,关闭最外面的流(oos)应该就足够了。但是实现似乎有缺陷。
示例:BufferedOutputStream从FilterOutputStream继承close(),后者将其定义为:
155 public void close() throws IOException {
156 try {
157 flush();
158 } catch (IOException ignored) {
159 }
160 out.close();
161 }
但是,如果flush()由于某种原因引发运行时异常,则永远不会调用out.close()。因此,大多数情况下担心关闭FOS(使文件保持打开状态)似乎“最安全”(但很丑)。
当您绝对需要确保关闭嵌套流时,什么才是最好的选择?
是否有任何官方Java / Sun文档对此进行了详细介绍?
阿晨1998
炎炎设计
青春有我
相关分类