关闭流链&尝试与 - 资源

时间:2014-01-16 15:38:29

标签: stream chain try-with-resources

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

1 个答案:

答案 0 :(得分:4)

良好做法是选择a)。

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

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

您可以找到其他信息herehere