【问题标题】:Java - close multi-layer stream wrapperJava - 关闭多层流包装器
【发布时间】:2013-05-16 03:51:48
【问题描述】:

在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

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

【问题讨论】:

    标签: java stream


    【解决方案1】:

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

    因此,在您的情况下,您只需要关闭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-04-28
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      相关资源
      最近更新 更多