Zil*_*ilk 179 java io filereader bufferedreader
我正在使用围绕FileReader的BufferedReader读取本地文件:
BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();
Run Code Online (Sandbox Code Playgroud)
我需要close()的FileReader为好,或将包装处理这个问题?我见过人们这样做的代码:
FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();
Run Code Online (Sandbox Code Playgroud)
从servlet调用此方法,我想确保不打开任何句柄.
Atm*_*ons 199
没有.
BufferedReader.close()
Run Code Online (Sandbox Code Playgroud)
根据BufferedReader和InputStreamReader的 javadoc 关闭流
以及
FileReader.close()
Run Code Online (Sandbox Code Playgroud)
确实.
McD*_*ell 95
正如其他人指出的那样,您只需要关闭外包装.
BufferedReader reader = new BufferedReader(new FileReader(fileName));
Run Code Online (Sandbox Code Playgroud)
如果BufferedReader构造函数抛出异常(例如OutOfMemoryError),则可能会泄漏文件句柄.如果您的应用程序处于此状态,那么清理需要多么谨慎可能取决于您不会剥夺操作系统可能要分配给其他程序的资源的重要性.
所述可关闭的,如果一个封装构造是可能在Java 5或6失败界面可用于:
Reader reader = new FileReader(fileName);
Closeable resource = reader;
try {
BufferedReader buffered = new BufferedReader(reader);
resource = buffered;
// TODO: input
} finally {
resource.close();
}
Run Code Online (Sandbox Code Playgroud)
Java 7代码应该使用try-with-resources模式:
try (Reader reader = new FileReader(fileName);
BufferedReader buffered = new BufferedReader(reader)) {
// TODO: input
}
Run Code Online (Sandbox Code Playgroud)
BufferedReader的源代码显示,当您关闭BufferedReader时,底层已关闭。
检查源代码后,我发现对于示例:
FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
Run Code Online (Sandbox Code Playgroud)
BufferedReader对象上的 close() 方法将调用Reader类的抽象 close() 方法,该方法最终将调用InputStreamReader类中的已实现方法,然后关闭InputStream对象。
所以,只有 bReader.close() 就足够了。