应该显式关闭BufferedReader和InputStreamReader吗?

时间:2017-11-17 09:44:57

标签: java java-8 inputstream bufferedreader

我想将InputStream的内容读入String

private String readToString(InputStream stream) {
    return new BufferedReader(new InputStreamReader(stream))
            .lines().collect(Collectors.joining("\n"));
}

该流来自java.lang.Process

问题:在这种情况下,我是否必须明确关闭InputStreamInputStreamReaderBufferedReader中的任何一个?

旁注:链接的问题是 NOT 重复,因为我的问题是 HOW 正确关闭流,而不是如何将流读取到字符串!< / p>

2 个答案:

答案 0 :(得分:6)

您只需关闭outer包装器,但不要明确地执行此操作 - 尝试使用资源可以让您的生活更轻松:

public String readToString(InputStream stream) {

    try (InputStreamReader reader = new InputStreamReader(stream);
            BufferedReader br = new BufferedReader(reader)) {

        return br.lines().collect(Collectors.joining("\n"));

    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }
}

还有一个很多更简单的方法来做到这一点,并且更清晰:

Files.readAllLines(YourPath)

答案 1 :(得分:3)

根据我的评论,关闭BufferedReader或InputStreamReader将导致InputStream关闭。您的readToString方法不应关闭流。这是来电者的责任。

理由: -

首先,在调用readToString之前,请考虑如何打开流。一个明智的方法是:

try (InputStream myStream = getInputStreamSomehow()) {
    //...
    String content = readToString(myStream);
    //...
}

将在您的try-with-resources块结束时关闭该流。

其次,考虑现有的最佳实践和习语。查看Java API方法,就像您的方法一样,读取流的全部内容。例如,来自Java 9:

上述任何一种方法都不会关闭流。同样,readToString方法的用户也不会期望您关闭他们的流。