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

Java缓冲区和流:释放底层资源,java,file-io,stream,resources,buffer,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 File

案例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()
做什么

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

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

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

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

不,你不需要那样做


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

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

公众假期结束() 抛出从类:Reader复制的IOException描述

关闭流并释放任何 与之关联的系统资源。 一旦溪流关闭, 进一步读取(),准备就绪(),标记(), 重置()或跳过()调用将 抛出一个IOException。结束 以前关闭的流没有 效果


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

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

public void close() {
  in.close();
}
如果中的
本身是一个装饰器,那么它的
close
方法将递归地关闭另一个资源


如果您感兴趣,可以查看
java.io
源代码。

他实际上在问题中得到了引用的相关部分。