考虑以下事件序列
public static void main(String[] a) throws IOException {
FileReader f = new FileReader(a[0]);
System.out.println(f.ready()); // true
doSomethingWithReader(f);
System.out.println(f.ready()); // false
}
private static String doSomethingWithReader(FileReader reader) {
BufferedReader br = null;
try {
br = new BufferedReader(reader);
...
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return line;
}
FileReader在任何地方都没有关闭,但关闭它的是什么?
答案 0 :(得分:9)
当您使用FileReader
打包Reader
(或任何BufferedReader
)时,在.close()
上调用BufferedReader
将关闭已包装/的基础{{} 1}}。
适用于所有可用作包装器的标准Reader,Writer,OutputStream和InputStream类都是如此。
答案 1 :(得分:3)
br.close();
关闭你的读者。
答案 2 :(得分:2)
查看implementation of BufferedReader:[open jdk7 implementation]
public void close() throws IOException
{
synchronized (lock) {
if (in == null)
return;
in.close();
in = null;
cb = null;
}
}
它会照顾close()
基础FileReader
。
答案 3 :(得分:0)
关闭BufferedReader
也会关闭它所包含的Reader
,所以在这种情况下,这是FileReader
。
答案 4 :(得分:0)
无论是否抛出异常,finally块都会执行。在finally块中,关闭包装文件读取器的缓冲读取器。关闭缓冲的阅读器将关闭所有基础流,包括文件阅读器使用的流。
答案 5 :(得分:0)
根据BufferedReader的文档,当你关闭br时(在finally块中),用于构造br的FileReader也会被关闭。