注意: 本问题及大多数答案均为Java 7发布之前的内容。Java 7提供了自动资源管理功能,可以轻松完成此操作。如果您使用的是Java 7或更高版本,应转到Ross Johnson的答案。
什么被认为是在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 }
然而,如果flush()由于某种原因抛出运行时异常,则out.close()将永远不会被调用。因此,最“安全”(但难看)的方法是主要关注关闭FOS,它保持文件处于打开状态。
在嵌套流中关闭流,最可靠、确保万无一失的方法是什么?
是否有任何官方的Java/Sun文档详细介绍这个问题?