Stream 关闭流链&;试用资源

Stream 关闭流链&;试用资源,stream,chain,try-with-resources,Stream,Chain,Try With Resources,关于stackoverflow的第一个问题,我退出;) 使用流链时,通常最好只关闭链中的最后一个流,因为close()操作应该传播到链中的所有流 将try与ressource语句和流链接相结合时,什么是最佳实践 a) 在try语句中创建所有流: try (InputStream processIn = p.getInputStream(); InputStreamReader inReader = new InputStreamReader(processIn);

关于stackoverflow的第一个问题,我退出;)

使用流链时,通常最好只关闭链中的最后一个流,因为close()操作应该传播到链中的所有流

将try与ressource语句和流链接相结合时,什么是最佳实践

a) 在try语句中创建所有流:

try (InputStream processIn = p.getInputStream();
            InputStreamReader inReader = new InputStreamReader(processIn);
            BufferedReader input = new BufferedReader(inReader)) { 
    .
    .
}
或b)仅为链的最后一个成员:

InputStream processIn = p.getInputStream();
InputStreamReader inReader = new InputStreamReader(processIn);
try (BufferedReader input = new BufferedReader(inReader)) { 
    .
    .
}
我想这两个版本最终都能工作,但我假设a)将生成重复的close()调用,不是吗?

好的做法是选择a)

如果您使用的是选项b),则如果reader中的流
初始化失败,则流
processIn
将不会关闭

另一方面,如果使用选项a),则每个流都将正确关闭。当然,如果您正在链接流,那么链中的第一个流可能会尝试关闭多次,但这对于流来说是可以的,因为它们都实现了,这要求方法
close()
是幂等的(即,如果流已经关闭,那么对
close()的附加调用)
应该没有效果)


<>你可以找到更多的信息。

我没有考虑可能的初始化问题。阅读本文的每个人都应该阅读描述类似问题的第二个链接。这两种情况在你思考的时候都很明显,但很容易被忽略。谢谢你的提示!