繁体   English   中英

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

[英]What are the Negative Effects of Not Closing a InputStreamReader

我正在修改另一个程序员编写的Java程序的一些代码,并且想知道将InputStreamReader包装在BufferedReader与制作一个InputStreamReader对象然后在其上再创建一个新的BuffererReader对象有什么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();

FileInputStream localFileInputStream = null;
localFileInputStream = new FileInputStream(someFile);
BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(localFileInputStream));
// Do some file processing 
localFileInputStream.close();
localBufferedReader.close();

在第一段代码中,我调用localInputStreamReader.close(); 但在第二个步骤中,我不知道(不知道如何做)。 这会有所不同吗?

从Java文档( BufferedReader)中

公共无效引发IOException

从类复制的描述:读者

关闭流并释放与之关联的所有>系统资源。 一旦关闭流,进一步的read(),ready(),mark(),reset()或skip()调用将引发IOException。 关闭先前关闭的流无效。

指定者:接口Closeable中的close指定者:接口AutoCloseable中的close

指定者:类关闭Reader

抛出:IOException-如果发生I / O错误

在BufferedReader上调用close()会默认实现关闭底层流,因为它是在超类Reader中指定的。 因此,您的两个代码段实际上都执行相同的操作。 当然,如果没有这样的规范,或者您将使用自己的编写器而忘记关闭给定的流,那么它将起到一定的作用。 例如,不关闭FileInputStream会使基础文件不可访问或至少不可写。

值得一提的是

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(您的所有Reader和InputStreams都实现了)说:

关闭此流并释放与其关联的所有系统资源。

因此,该规范要求兼容的实现将关闭调用实际上委派给所有包装的资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM