我想将InputStream
的内容读入String
:
private String readToString(InputStream stream) {
return new BufferedReader(new InputStreamReader(stream))
.lines().collect(Collectors.joining("\n"));
}
该流来自java.lang.Process
。
问题:在这种情况下,我是否必须明确关闭InputStream
,InputStreamReader
或BufferedReader
中的任何一个?
旁注:链接的问题是 NOT 重复,因为我的问题是 HOW 正确关闭流,而不是如何将流读取到字符串!< / p>
答案 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
方法的用户也不会期望您关闭他们的流。