关闭流链和尝试资源



我关于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()的额外调用应该没有效果)。

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

相关内容

  • 没有找到相关文章

最新更新