如果我在 Java 中使用带 BufferedReader 的流式传输,是否存在任何资源泄漏
Is there any resource leak if I use streaming with BufferedReader in Java
我有很多代码。 (没有 read
或 close
调用)。我是否需要关闭 InputStream 或 BufferedReader?这里有代码味道/资源泄漏吗?
InputStream stream = response.getEntity().getContent();
String response = new BufferedReader(new InputStreamReader(stream)).lines()
.collect(Collectors.joining("\n"));
编辑
根据答案,这是正确的吗
InputStream stream = response.getEntity().getContent();
String response;
try (BufferedReader br = new BufferedReader(new InputStreamReader(responseStream))) {
response = br.lines().collect(Collectors.joining("\n"));
}
不,在这种情况下,流不会在执行流管道操作时自动关闭,事实上,如 the documentation 中所述,也 无法保证 reader将位于读取下一个字符或行的特定位置。
简而言之Stream
s (java-stream) are not responsible for manipulating the stream (stream) 已作为资源传递处理。因此,在这种情况下确保自动关闭流的首选方法是使用 try-with-resource 方法,如下所示:
try (InputStream stream = request.getEntity().getContent();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream))) {
String response = bufferedReader.lines().collect(Collectors.joining("\n"));
}
我有很多代码。 (没有 read
或 close
调用)。我是否需要关闭 InputStream 或 BufferedReader?这里有代码味道/资源泄漏吗?
InputStream stream = response.getEntity().getContent();
String response = new BufferedReader(new InputStreamReader(stream)).lines()
.collect(Collectors.joining("\n"));
编辑
根据答案,这是正确的吗
InputStream stream = response.getEntity().getContent();
String response;
try (BufferedReader br = new BufferedReader(new InputStreamReader(responseStream))) {
response = br.lines().collect(Collectors.joining("\n"));
}
不,在这种情况下,流不会在执行流管道操作时自动关闭,事实上,如 the documentation 中所述,也 无法保证 reader将位于读取下一个字符或行的特定位置。
简而言之Stream
s (java-stream) are not responsible for manipulating the stream (stream) 已作为资源传递处理。因此,在这种情况下确保自动关闭流的首选方法是使用 try-with-resource 方法,如下所示:
try (InputStream stream = request.getEntity().getContent();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream))) {
String response = bufferedReader.lines().collect(Collectors.joining("\n"));
}