注意: 这个问题及其大部分答案可以追溯到 Java7发布之前。Java7为此提供了 自动资源管理功能。如果您正在使用 Java7或更高版本,则应该升级到 罗斯 · 约翰逊的回答。
在 Java 中,什么被认为是关闭嵌套流的最好、最全面的方法? 例如,考虑下面的设置:
FileOutputStream fos = new FileOutputStream(...)
BufferedOS bos = new BufferedOS(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
我明白关闭操作需要投保(可能通过使用 finally 条款)。我想知道的是,是否有必要显式地确保嵌套流已关闭,还是仅仅确保关闭外部流(oos)就足够了?
我注意到,至少在处理这个特定示例时,内部流似乎只抛出 FileNotFoundException。这似乎意味着在技术上没有必要担心如果他们失败了就关闭它们。
下面是一位同事写的:
从技术上讲,如果实施正确,关闭最外层 流(oos)应该足够了,但实现似乎有缺陷。
例如: BufferedOutputStream 从 FilterOutputStream 继承 close () ,它将其定义为:
155 public void close() throws IOException {
156 try {
157 flush();
158 } catch (IOException ignored) {
159 }
160 out.close();
161 }
但是,如果 flash ()由于某种原因引发运行时异常,那么 Close ()将永远不会被调用 主要是担心关闭 FOS,这会使文件保持打开状态。
当您绝对需要确定时,什么被认为是关闭嵌套流的最佳方法?
有没有官方的 Java/Sun 文档详细处理这个问题?