如果我在Java中使用BufferedReader流媒体,是否存在资源泄漏

如果我在Java中使用BufferedReader流媒体,是否存在资源泄漏,java,stream,inputstream,bufferedreader,java-stream,Java,Stream,Inputstream,Bufferedreader,Java Stream,这几乎就是我的代码。(无读取或关闭调用)。我需要关闭InputStream或BufferedReader吗?这里是否存在代码气味/资源泄漏 InputStream stream = response.getEntity().getContent(); String response = new BufferedReader(new InputStreamReader(stream)).lines() .collect(Collectors.joining("\n"

这几乎就是我的代码。(无
读取
关闭
调用)。我需要关闭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"));
                }

不,在这种情况下,流在执行流管道操作时不会自动关闭,事实上,如中所述,也不能保证读取器将位于读取下一个字符或行的特定位置

简而言之,
Stream
s()不负责处理作为资源传递的流()。因此,在这种情况下,确保自动关闭流的首选方法是使用try with resource方法,如下所示:

try (InputStream stream = request.getEntity().getContent();
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream))) {
    String response = bufferedReader.lines().collect(Collectors.joining("\n"));
}

在Java7或更新版本中,请尝试自动关闭Closables。这会在将来的某个时候帮你省掉头发撕裂的麻烦。是的,先生。我知道自动可关闭。但是,我是否需要一个基于您建议的编辑流程,因为我将在try块之外使用
response
。@头脑风暴您可以在
try{}
块之前初始化
response
。在变量分配方面没有资源泄漏。相反,您是否明确希望将
InputStream
也保留在try之外?不确定其他用法,但您也可以使用
try(BufferedReader BufferedReader=new BufferedReader(new InputStreamReader(request.getEntity().getContent())))…
,并使用读取器查找
响应。