Stream 关闭流链&;试用资源
关于stackoverflow的第一个问题,我退出;) 使用流链时,通常最好只关闭链中的最后一个流,因为close()操作应该传播到链中的所有流 将try与ressource语句和流链接相结合时,什么是最佳实践 a) 在try语句中创建所有流: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);
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()的附加调用)
应该没有效果)
<>你可以找到更多的信息。我没有考虑可能的初始化问题。阅读本文的每个人都应该阅读描述类似问题的第二个链接。这两种情况在你思考的时候都很明显,但很容易被忽略。谢谢你的提示!