我正在使用一个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 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
}