我是否需要closures()FileReader和BufferedReader?

我正在阅读本地文件使用一个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() 

根据javadoc为BufferedReader和InputStreamReader closuresstream

以及

 FileReader.close() 

确实。

正如其他人指出的,你只需要closures外包装。

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

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

如果包装器构造函数可能在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 } 

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

BufferedReader的源代码显示closuresBufferedReader时底层已closures。

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

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

BufferedReader对象上的close()方法将调用Reader类的abstract close()方法,最终调用InputStreamReader类中实现的方法,然后closuresInputStream对象。

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

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