我正在修改由另一个程序员编写的Java程序的一些代码,我想知道在InputStreamReader
中包装BufferedReader
与制作InputStreamReader
对象的区别是什么然后在其上创建一个新的BuffererReader
对象。例如,这个
FileInputStream localFileInputStream = null;
localFileInputStream = new FileInputStream(someFile);
InputStreamReader localInputStreamReader = new InputStreamReader(localFileInputStream);
BufferedReader localBufferedReader = new BufferedReader(localInputStreamReader);
// Do some file processing
localFileInputStream.close();
localInputStreamReader.close();
localBufferedReader.close();
VS
FileInputStream localFileInputStream = null;
localFileInputStream = new FileInputStream(someFile);
BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(localFileInputStream));
// Do some file processing
localFileInputStream.close();
localBufferedReader.close();
在第一个代码块中,我调用了localInputStreamReader.close();
但是在第二个块中我没有(不知道我会怎么做)。这会有什么不同吗?
答案 0 :(得分:3)
来自Java文档(BufferedReader):
靠近
public void抛出IOException
从类中复制的描述:Reader
关闭流并释放任何>与之相关的系统资源 它。流关闭后,进一步read(),ready(),mark(), reset()或skip()调用将抛出IOException。关闭一个 以前关闭的流没有效果。
指定者:close in interface Closeable指定者:接口AutoCloseable中的close
指定者:在类Reader中关闭
抛出:IOException - 如果是I / O. 发生错误
在BufferedReader上调用close()会默认关闭基础流,因为它是在超类Reader中指定的。因此,您的两个代码段实际上都是一样的。当然,如果没有这样的规范,或者你会使用自己的作家而忘记关闭你的给定流,它会产生一些影响。例如,不关闭FileInputStream会使底层文件无法访问或至少不可写。
答案 1 :(得分:1)
值得一提的是
BufferedReader localBufferedReader = new BufferedReader(
new InputStreamReader(new FileInputStream(someFile)));
// Do some file processing
localBufferedReader.close();
就足够了。 使用Java 7及更高版本,您可以使用try-with-resources来忘记关闭它:
try(BufferedReader localBufferedReader = new BufferedReader(
new InputStreamReader(new FileInputStream(someFile)))) {
// Do some file processing
}
请注意 java.io.Closeable 的API(所有Readers和InputStream实现的)说:
关闭此流并释放与其关联的所有系统资源。
因此规范要求合规实现实际委托对所有包装资源的close调用。