案例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()
做了什么?
文档说:“关闭流并释放与之关联的任何系统资源。”
它是否也会关闭所有“底层”资源?或者正确的代码是实例化所有缓冲区和流并逐个关闭?
答案 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()
的调用将通过底层对象级联。