正确的方法来关闭一个自动关闭

时间:2019-05-13 12:41:21

标签: java resources serversocket outputstream

关闭OutputStreamServerSocket或其他实现AutoCloseable接口的对象时遵循的最可靠的模式是什么?

我应该使用try-catch-finally吗?或关闭钩子。

1 个答案:

答案 0 :(得分:1)

使用AutoCloseable实例的正确方法是使用try-with-resources块,因此即使抛出异常,资源也可靠地closed

赞:

    try (OutputStream stream = new ...) {
       ... // use the resource
    } catch (IOException e) {
        ... // exception handling code
    }

您还可以control multiple resources使用一个块(而不是嵌套块):

try (
     OutputStream out1 = ...;
     OutputStream out2 = ...;
     InputStream in1 = ...;
     InputStream in2 = ...;
) {
     ...
}

Don't use a try...finally block:在某些极端情况(需要suppressed exception的情况)下,这是不正确的。

不要使用关闭钩子:资源很少真正是虚假的,而且这种方法很容易出现种族危险。使用try-with-resources是正确关闭所有 AutoCloseable资源的推荐方式:两者同时引入Java,以便它们可以一起工作。

暗中地执行此操作有助于实施(推荐)规则,即只有负责创建或打开某物的代码才负责处置或关闭它:如果方法通过了OutputStream,则它应该从不< / em> close()。相反,它应该依赖于调用方将其关闭。如果您的方法都没有显式调用close(),则可以保证您的代码绝不会引发异常(例如"Socket closed" java.net.SocketException),因为它会尝试使用已关闭的资源。

这样做可以确保资源恰好关闭一次。请注意,通常,多次关闭AutoCloseable是不安全的:{strong>不不能保证close()操作是幂等的。