关闭 AutoCloseable 的正确方法

Rae*_*ald 5 java resources outputstream serversocket

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

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

Rae*_*ald 5

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

像这样:

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

您还可以使用一个块(而不是嵌套块)控制多个资源

try (
     OutputStream out1 = ...;
     OutputStream out2 = ...;
     InputStream in1 = ...;
     InputStream in2 = ...;
) {
     ...
}
Run Code Online (Sandbox Code Playgroud)

不要使用try...finally:对于某些边缘情况(需要抑制异常的情况),它会表现不正常。

不要使用关闭钩子:资源很少是真正全局的,这种方法很容易出现竞争风险。try-with-resources 是正确关闭所有 AutoCloseable资源的推荐方式:两者是同时引入 Java 的,因此它们可以一起工作。

这样做有助于隐含执行(推荐)规则只负责创建或打开的东西是负责处置或关闭它的代码:如果一个方法传递的OutputStream,它应该永远不会 close()了。它应该依赖于调用者关闭它。如果您的任何方法都没有显式调用close(),则保证您的代码永远不会抛出异常(例如“套接字已关闭”java.net.SocketException),因为它会尝试使用已关闭的资源。

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

  • @Rick 我正在回答我自己的问题 [鼓励](https://stackoverflow.com/help/self-answer)。你应该阅读*游览*。 (5认同)
  • 你为什么要回答自己的问题? (2认同)