【问题标题】:Java Buffers and Streams: Releasing underlying resourcesJava 缓冲区和流:释放底层资源
【发布时间】:2011-02-12 03:37:40
【问题描述】:

案例一:

BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream(file) ) );
br.close();

案例2:

BufferedReader br = new BufferedReader( new FileReader(file) );
br.close();

案例 3:

InputStream bis = new BufferedInputStream( new FileInputStream(src) );
bis.close();

close() 是做什么的?

文档说:“关闭流并释放与之关联的所有系统资源。”

它是否也关闭任何“基础”资源?或者正确的代码是实例化所有缓冲区和流并一一关闭?

【问题讨论】:

    标签: java file-io stream resources buffer


    【解决方案1】:

    是的,底层资源被释放。 Java IO 流类是Decorator pattern 的一个很好的例子,即具有与其包含的对象相同的接口的对象。这使得close() 方法非常简单和优雅,例如类似:

    public void close() {
      in.close();
    }
    

    如果in 本身就是一个装饰器,它的close 方法将递归地关闭另一个资源。

    如果您有兴趣,可以查看java.io源代码online here

    【讨论】:

      【解决方案2】:

      它是否也关闭了任何“基础”资源?

      是的

      或者正确的代码是实例化所有缓冲区和流并一个一个关闭?

      不,您不需要这样做。

      我一直认为这是未明确说明的文档缺陷。然而,“与之相关的任何系统资源”一词暗示了这一点。因为,即使中间有一个额外的层,你的 BufferedReader 仍然与一个文件相关联,以符合它需要递归到其包装流中的文档。一旦这些资源被释放,一旦你的流停止被引用,它就只是垃圾收集器的工作。

      【讨论】:

        【解决方案3】:

        您只需要关闭最外层的流类,因为 close() 调用会自动通过所有链接的类。

        公共无效关闭() 从类中复制的抛出 IOException 描述:Reader

        关闭流并释放任何 与之相关的系统资源。 关闭流后, 进一步阅读(),准备(),标记(), reset() 或 skip() 调用将 抛出一个 IOException。关闭一个 先前关闭的流没有 效果。

        http://download.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#close%28%29

        【讨论】:

        • 他实际上在他的问题中得到了引用的相关部分。
        【解决方案4】:

        通常对close() 的调用将通过底层对象向下级联。

        【讨论】:

          猜你喜欢
          • 2016-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-22
          相关资源
          最近更新 更多