我是否需要关闭()FileReader和BufferedReader?

问题描述:

我读使用周围的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调用,我想确保我不会留下任何的把手打开。

+4

你知道,你可以阅读这个信息的来源。它全部存放在JDK安装目录的src.zip中,或者您可以在线阅读它,例如http://www.docjar.com/html/api/java/io/BufferedReader.java.html – gustafc 2009-09-07 10:46:02

+36

告诉某人阅读该来源比说“RTFM!”更糟糕。如果源有错误怎么办?隐含地,我们想知道*正确*行为是什么? – Raedwald 2013-07-05 11:48:05

+1

那么......从这个角度来看:指向API规范并不是那么好。如果源文件没有导致其不像文档中指定的那样发生错误,则不能依赖文档。所以没有办法回答这样的问题。 – Atmocreations 2015-09-18 07:40:18

没有。

BufferedReader.close() 

根据Javadoc中BufferedReaderInputStreamReader

以及

FileReader.close() 

确实关闭该流

+7

+1简洁明了。 – CPerkins 2009-09-07 12:44:47

+11

除非'BufferedReader'的构造函数抛出异常。尽管你需要注意装饰器与其他资源和缓冲,但关闭底层流更简洁。 – 2009-09-07 14:55:44

+6

Javadoc没有说“BufferedReader.close()”是否关闭了底层的阅读器。它的描述只是从'Reader.close()'复制而来。这可能是实际中的实际行为,但没有记录。 – 2015-03-30 22:12:18

根据BufferedReader来源,在这种情况下,bReader.close调用fReader.close,所以在技术上你不必调用后者。

BufferedReader的源代码显示关闭BufferedReader时底层已关闭。

+0

我真的很想给这个链接一个具体的东西,但这只是指OpenJDK的实现,并且由于JavaDocs不清楚'Reader#close()',这并没有提供具体的证据证明Oracle JDK例如,以类似的方式实施。 – searchengine27 2015-10-29 22:15:48

正如其他人指出的,您只需关闭外包装。

BufferedReader reader = new BufferedReader(new FileReader(fileName)); 

有一个非常渺茫的机会,这可能泄漏的文件句柄如果BufferedReader构造函数抛出异常(例如OutOfMemoryError)。如果你的应用程序处于这种状态,那么你的清理工作需要多小心可能取决于你不会剥夺操作系统可能想要分配给其他程序的资源的重要性。

Closeable接口可用于如果一个封装构造是可能在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 
} 
+3

谢谢,这非常有启发性。 – Zilk 2009-09-07 11:08:56

+0

以同样的方式:http://*.com/a/2732760/281545 – 2014-04-15 15:41:02

你只需要关闭bufferedReader即reader.close(),它会正常工作。

检查源代码后,我发现对于例如:

FileReader fReader = new FileReader(fileName); 
BufferedReader bReader = new BufferedReader(fReader); 

的BufferedReader的close()方法对象将调用读卡器类的抽象close()方法这将最终调用InputStreamReader类的实现方法,然后关闭InputStream对象。

所以,只有bReader.close()就足够了。

+1

源代码显示的内容不适合作为参考。这就是*规范*所说的,在这种情况下,可以依赖于Javadoc。 – EJP 2015-12-10 04:18:06