java - 我是否需要关闭()FileReader和BufferedReader?
我正在使用围绕FileReader的BufferedReader读取本地文件:
BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();
我是否还需要close() FileReader,或者包装器会处理吗?我见过人们这样做的代码:
FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();
从servlet调用此方法,我想确保不打开任何句柄。
8个解决方案
193 votes
没有。
BufferedReader.close()
根据BufferedReader和InputStreamReader的javadoc关闭流
以及
FileReader.close()
确实。
Atmocreations answered 2019-04-23T07:11:05Z
87 votes
正如其他人指出的那样,您只需要关闭外包装。
BufferedReader reader = new BufferedReader(new FileReader(fileName));
如果BufferedReader构造函数抛出异常(例如OutOfMemoryError),则可能会泄漏文件句柄的可能性非常小。 如果您的应用程序处于此状态,那么清理需要多么谨慎可能取决于您不会剥夺操作系统可能要分配给其他程序的资源的重要性。
如果包装器构造函数可能在Java 5或6中失败,则可以使用Closeable接口:
Reader reader = new FileReader(fileName);
Closeable resource = reader;
try {
BufferedReader buffered = new BufferedReader(reader);
resource = buffered;
// TODO: input
} finally {
resource.close();
}
Java 7代码应该使用try-with-resources模式:
try (Reader reader = new FileReader(fileName);
BufferedReader buffered = new BufferedReader(reader)) {
// TODO: input
}
McDowell answered 2019-04-23T07:11:54Z
6 votes
根据BufferedReader源代码,在这种情况下bReader.close调用fReader.close,所以从技术上讲你不必调用后者。
Csaba_H answered 2019-04-23T07:12:19Z
4 votes
BufferedReader的源代码显示关闭BufferedReader时底层是关闭的。
Brian Agnew answered 2019-04-23T07:12:45Z
3 votes
检查源代码后,我发现了例子:
FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
BufferedReader对象上的close()方法将调用Reader类的抽象close()方法,该方法最终将调用InputStreamReader类中的实现方法,然后关闭InputStream对象。
所以,只有bReader.close()就足够了。
Anup Verma answered 2019-04-23T07:13:26Z
0 votes
你只需要关闭bufferedReader,即reader.close(),它就能正常工作。
robust12 answered 2019-04-23T07:13:54Z
0 votes
从Java 7开始,您可以使用try-with-resources语句
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
因为BufferedReader实例是在try-with-resource语句中声明的,所以无论try语句是正常还是突然完成,它都将被关闭。 因此,您无需在finally语句中自行关闭它。 (嵌套资源语句也是如此)
这是使用资源的推荐方法,有关更多详细信息,请参阅文档
Claudiu answered 2019-04-23T07:14:35Z
0 votes
我迟到了,但是:
BufferReader.java:
public BufferedReader(Reader in) {
this(in, defaultCharBufferSize);
}
(...)
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
try {
in.close();
} finally {
in = null;
cb = null;
}
}
}
Дима Гашко answered 2019-04-23T07:15:07Z