说我做的事情如下:
Reader r = new BufferedReader(new FileReader(file));
... read ...
r.close()
这是否会关闭底层的FileReader(并释放打开的文件句柄)?
-Dave
答案 0 :(得分:17)
是的,在最外面close
调用Reader
就足够了。
Java I/O Streams上的Sun Developer Network文章有一个关于流链接的部分,其中包含以下内容:
FileOutputStream fos = new FileOutputStream("myfile.out"); CryptOutputStream cos = new CryptOutputStream(fos); GZIPOutputStream gos = new GZIPOutputStream(cos);
[...]
[...]关闭链接时 溪流,你只需要关闭 最外层的流类因为
close()
电话会自动涓涓细流 通过所有链式课程;在 上面的例子,你会很简单 调用close()
方法GZIPOutputStream
上课。
因此,在这种情况下,只需要在close
上拨打BufferedReader
。
作为dtsazza already mentioned,Java API Specification类的BufferedReader
表示BufferedReader.close
方法将释放任何基础资源:
关闭流并释放与其关联的所有系统资源。 [...]
因此,可以推断出任何潜在的Reader
,即使它可能没有明确说明。
答案 1 :(得分:4)
根据the documentation,它只是“释放与[读者]相关的任何系统资源”。读者是否关闭任何嵌套的读者是特定类的实现问题。
在您提到的具体示例中 - 是的,BufferedReader
将始终关闭嵌套的阅读器。但是当这个通常发生时,这并不一定意味着具有某种嵌套读者的Reader
接口的所有实现将传播{{1调用它们 - 您需要检查该特定类的文档以查找。
答案 2 :(得分:0)
答案 3 :(得分:0)
是的,这是装饰者模式。