我关于stackoverflow的第一个问题,我退出了;)
使用流链时,通常只关闭链中的最后一个流是很好的做法,因为 close() 操作应该传播到链的所有流。
在结合使用 try-with-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),那么如果流inReader
初始化失败,则流 processIn
将不会关闭。
另一方面,如果您使用的是选项 a),则每个流都将正确关闭。当然,如果你正在链接流,那么链中的第一个流可能会尝试多次关闭,但这对流来说是可以的,因为它们都实现了Closeable
,这要求方法close()
是幂等的(即,如果流已经关闭,那么对close()
的额外调用应该没有效果)。
您可以在此处和此处找到更多信息。