Java缓冲区和流:释放底层资源

时间:2011-02-12 03:37:41

标签: java file-io stream resources buffer

案例1:

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()做了什么?

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

它是否也会关闭所有“底层”资源?或者正确的代码是实例化所有缓冲区和流并逐个关闭?

4 个答案:

答案 0 :(得分:2)

是的,基础资源已经发布。 Java IO流类是Decorator pattern的一个很好的例子,即具有与其包含的对象相同的接口的对象。这使得close()方法非常简单和优雅,例如类似的东西:

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

如果in本身就是装饰器,则其close方法将以递归方式关闭另一个资源。

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

答案 1 :(得分:1)

  

它是否也关闭了任何“底层”资源?

  

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

不,你不需要这样做。

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

答案 2 :(得分:0)

你只需要关闭最外面的流类,因为close()调用会自动遍历所有链接类。

  

public void close()              throws IOException说明从类复制:Reader

     

关闭流并释放任何流   与之相关的系统资源。   流关闭后,   进一步read(),ready(),mark(),   reset()或skip()调用将会   抛出IOException。关闭一个   以前封闭的流没有   效果。

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

答案 3 :(得分:0)

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