关于java:是否需要在BufferedReader中关闭InputStreamReader

Is it necessary to close an InputStreamReader in a BufferedReader

本问题已经有最佳答案,请猛点这里访问。

我们都知道,关闭代码末尾定义的所有StreamReader是一个好习惯。

现在我们可以看到两个Reader的定义如下。 BufferedReader和InputStreamReader.BufferedReader已关闭,但我们无法关闭InputStreamReader。

JAVA代码:

1
2
3
4
5
BufferedReader in = new BufferedReader(new InputStreamReader(
    connection.getInputStream()));
if (in != null) {
    in.close();
    }

问题出在这里,是否应该关闭括号中的InputStreamReader?这种代码会给程序带来一些问题吗?请告诉我,谢谢?


关闭您使用的任何资源很重要。

in.close将关闭BufferedReader,后者又关闭其本身使用的资源。 InputStreamReader。

因此,假设在调用in.close之前没有异常发生,您将要关闭它们两者。

为确保关闭它,无论使用什么try-with-resources,一旦完成阻止或发生异常,它将自动为您关闭它。

您可以这样做:

1
2
try(BufferedReader in = new BufferedReader(new InputStreamReader(
connection.getInputStream()))){/*code here*/}

try()中的所有资源均已保证关闭。


这样做没有问题,实际上Java API的InputStreamReader文档可以做到这一点。

在这种情况下,InputStreamReaderBufferedReader使用,这意味着当调用BufferedReader close()函数时,它们都将关闭:"关闭流并释放任何系统资源"由于InputStreamReader也很明显地与流"关联",它也将被关闭。

以这种方式使用InputStreamReader构建BufferedReader时,它们实际上是捆绑在一起的同一台读取器,而不是两个不同的读取器。