我需要close()两FileReader和BufferedReader?
-
21-09-2019 - |
题
我读的一个地方文件中使用的BufferedReader缠FileReader:
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,我想确保我不会留下任何处理开放。
解决方案
没有。
BufferedReader.close()
关闭流 按照如果是的话,为什么不试用一下 BufferedReader 和 InputStreamReader
以及
FileReader.close()
不。
其他提示
正如其他人所指出的那样,你只需要关闭外包装。
BufferedReader reader = new BufferedReader(new FileReader(fileName));
有一个非常渺茫的机会,这可能泄漏的文件句柄,如果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();
}
Java 7的代码应使用尝试与 - 资源图案:
try (Reader reader = new FileReader(fileName);
BufferedReader buffered = new BufferedReader(reader)) {
// TODO: input
}
据BufferedReader中源,在这种情况下bReader.close通话fReader.close所以理论上讲,你不必调用后者。
有的BufferedReader 显示的源代码,该底层是在关闭的BufferedReader关闭。
检查源代码后,我发现,对于示例:
FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
的关闭()上的方法的的BufferedReader 的对象将调用的阅读器类这将最终调用实现的方法中的的InputStreamReader 抽象close()方法b>类,它然后关闭的 InputStream的的对象。
因此,只有bReader.close()是足够的。
您只需要关闭的BufferedReader即reader.close(),它会正常工作。
我来晚了,但是:
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;
}
}
}
你的 不不 需要关闭的包裹读者/作家。
如果你已经采取了一看文档(Reader.close()
,Writer.close()
),你会看到在 Reader.close()
它说:
关闭流和发布的任何系统的资源与它相关联。
它只是说,它"释放任何系统的资源 关联 它"。即使它并不确认..它给你一个推动开始寻找更深。如果你去 Writer.close()
它只能指出,它关闭本身。
在这种情况下,我们参考 们可根据最新的技术提供一些 看看源代码。
在BufferedWriter 线265 你会看到 out.close()
.因此,它不关闭本身..这是别的东西。如果你搜索的类出现的"out
"你会注意到,在构造在 行87 那 out
是作者的类包装它呼吁另一个构造和再分配 out
参数对它自己的 out
变..
所以..什么其他人?你可以看到类似的代码 BufferedReader线514, BufferedInputStream线468 和 InputStreamReader线199.别人我不知道但是这应该足以假定,他们这样做。