不关闭InputStreamReader的负面影响是什么?

时间:2016-06-28 20:29:57

标签: java io

我正在修改由另一个程序员编写的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();但是在第二个块中我没有(不知道我会怎么做)。这会有什么不同吗?

2 个答案:

答案 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调用。