我正在使用一个BufferedReader包装FileReader读取一个本地文件:

BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();

我是否需要关闭()FileReader,或者包装器将处理它? 我曾见过这样的代码:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();

这个方法是从servlet调用的,我希望确保没有留下任何句柄。


当前回答

BufferedReader的源代码显示,当您关闭BufferedReader时,底层是关闭的。

其他回答

你只需要关闭bufferedReader,即reader.close(),它就会工作得很好。

从Java 7开始,你可以使用try-with-resources语句

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

因为BufferedReader实例是在try-with-resource语句中声明的,所以无论try语句是正常完成还是突然完成,它都将被关闭。所以你不需要在finally语句中自己关闭它。(对于嵌套的资源语句也是如此)

这是使用资源的推荐方式,有关更详细的信息,请参阅文档

根据BufferedReader源代码,在这种情况下,bReader。近距离呼叫fReader。关闭,从技术上讲,您不必调用后者。

您不需要关闭被包装的读取器/写入器。

如果你已经看过文档(Reader.close(),Writer.close()),你会看到在Reader.close()中它说:

关闭流并释放与之关联的所有系统资源。

它只是说它“释放与之相关的任何系统资源”。即使它没有证实…它会促使你开始深入研究。如果你去Writer.close(),它只声明它关闭自己。

在这种情况下,我们会参考OpenJDK来查看源代码。

在BufferedWriter第265行,你会看到out.close()。所以它没有关闭自己。是别的东西。如果你在类中搜索“out”的出现,你会注意到在构造函数的第87行,out是写入器,类包装它调用另一个构造函数,然后将out形参分配给它自己的out变量。

所以. .其他人呢?你可以在BufferedReader第514行、BufferedInputStream第468行和InputStreamReader第199行看到类似的代码。其他我不知道,但这应该足以假设他们做。

no.

BufferedReader.close()

根据javadoc关闭BufferedReader和InputStreamReader的流

还有

FileReader.close()

所做的事。