关闭嵌套的Reader

fre*_*low 13 java file-io stream resource-management try-finally

从文本文件中读取时,通常会创建一个FileReader然后将其嵌入到文本文件中BufferedReader.我读完后应该关闭哪两个读者?有关系吗?

FileReader fr = null;
BufferedReader br = null;
try
{
    fr = new FileReader(fileName);
    br = new BufferedReader(fr);
    // ...
}
finally
{
    // should I close fr or br here?
}
Run Code Online (Sandbox Code Playgroud)

在涉及异常安全方面,我有点偏执.当BufferedReader构造函数抛出异常时会发生什么?它是否关闭了嵌套的阅读器?还是保证不扔?

McD*_*ell 10

通常,close()在最外层的流包装器上将调用close()包装的流.但是,如果您认为构造函数可能会抛出异常,请自由使用Closeable接口.

FileReader fr = new FileReader(fileName);
Closeable res = fr;
try {
    BufferedReader br = new BufferedReader(fr);
    res = br;
} finally {
    res.close();
}
Run Code Online (Sandbox Code Playgroud)

因此,即使JVM用尽缓冲区的堆空间并引发错误,也不会泄漏文件句柄.

对于Java 7及更高版本,请使用try-with-resources:

try (FileReader fr = new FileReader(fileName);
    BufferedReader br = new BufferedReader(fr)) {
  // do work
}
Run Code Online (Sandbox Code Playgroud)