5

在 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();
}

ObjectOutputStreamFileOutputStream. 类似的情况是使用BufferedReaderto wrap InputStreamReader

我的问题是如何按顺序正确关闭fos和。oos应该先关闭哪个?或者只需要关闭其中一个。通常关闭两个流都会起作用,但我对这种方式感到不舒服,因为我不理解语义。我只是使用 close 方法关闭所有内容,而我不知道为什么不直接关闭fosoos.

4

1 回答 1

5

关闭包装流会自动关闭内部流。

所以,在你的情况下,你只需要 close 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
}
于 2013-05-16T04:00:35.260 回答