【问题标题】:Closing stream chains & try-with-resource关闭流链和尝试资源
【发布时间】:2014-01-16 15:38:29
【问题描述】:

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

【问题讨论】:

    标签: stream chain try-with-resources


    【解决方案1】:

    良好做法是选项 a)。

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

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

    您可以在herehere 找到更多信息。

    【讨论】:

    • 我没有考虑可能的初始化问题。阅读本文的每个人还应该阅读描述类似问题的第二个链接。当您考虑时,这两种情况都很明显,但很容易被忽视。感谢您的提示!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2015-06-21
    • 2017-01-03
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多