作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在Java中,我们通常使用一个流对象来包装另一个流类以提高效率。例如:
Object obj = new MyClass();
try {
FileOutputStream fos = new FileOutputStream("test.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
oos.flush();
} catch(IOException e) {
e.printStackTrace();
} finally {
fos.close();
oos.close();
}
我使用 ObjectOutputStream
来包装 FileOutputStream
。类似的情况是使用 BufferedReader
来包装 InputStreamReader
。
我的问题是如何按顺序正确关闭fos
和oos
。应该先关闭哪个?或者只需要关闭其中一个。通常关闭两个流都会起作用,但我对这种方式感到不舒服,因为我不理解语义。我只是使用关闭方法关闭所有内容,而我不知道为什么不关闭 fos
或 oos
。
最佳答案
关闭包装流会自动关闭内部流。
因此,在您的情况下,您只需要关闭 ObjectOutputStream
。关闭流两次不会引发异常,因此您已经在做的事情(尽管没有必要)也能正常工作。
以下是实例化 ObjectOutputStream
public ObjectOutputStream(OutputStream out) throws IOException {
bout = new BlockDataOutputStream(out); // inner stream being wrapped
...
}
下面是ObjectOutputStream.close()
的实现
public void close() throws IOException {
flush();
clear();
bout.close(); // inner stream being closed
}
关于Java - 关闭多层流包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16578720/
我是一名优秀的程序员,十分优秀!