关闭流链和尝试资源

Joh*_*son 5 stream chain try-with-resources

我对stackoverflow的第一个问题,我退出了;)

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

将try-with-source语句和流链接结合在一起时,什么被认为是好的做法?

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

try (InputStream processIn = p.getInputStream();
            InputStreamReader inReader = new InputStreamReader(processIn);
            BufferedReader input = new BufferedReader(inReader)) { 
    .
    .
}
Run Code Online (Sandbox Code Playgroud)

或b)只是链中的最后一个成员:

InputStream processIn = p.getInputStream();
InputStreamReader inReader = new InputStreamReader(processIn);
try (BufferedReader input = new BufferedReader(inReader)) { 
    .
    .
}
Run Code Online (Sandbox Code Playgroud)

我猜这两个版本最终都可以使用,但是我假设a)会生成重复的close()调用,不是吗?

And*_*nin 6

好的做法是选项 a)。

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

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

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