5

我关于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() 调用,不是吗?

4

1 回答 1

6

好的做法是选项 a)。

如果您使用的是选项 b),那么如果流的初始化inReader失败,那么流processIn将不会被关闭。

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

您可以在此处此处找到更多信息。

于 2014-01-25T09:52:11.477 回答