关闭OutputStream、ServerSocket或其他实现AutoCloseable接口的对象时,最可靠的模式是什么?
我应该使用try-catch-finally?吗?或者关闭钩子。
发布于 2019-05-13 12:41:20
使用AutoCloseable实例的正确方法是使用-有-资源块,因此即使抛出异常,资源也是可靠的关着的不营业的。
如下所示:
    try (OutputStream stream = new ...) {
       ... // use the resource
    } catch (IOException e) {
        ... // exception handling code
    }您还可以使用一个块(而不是嵌套块)来控制多个资源:
try (
     OutputStream out1 = ...;
     OutputStream out2 = ...;
     InputStream in1 = ...;
     InputStream in2 = ...;
) {
     ...
}区块:对于某些边缘情况(需要抑制异常的情况),这会导致错误行为。
不要使用关闭钩子:资源很少是真正的全局,而且这种方法很容易产生种族风险。try-with是正确关闭all AutoCloseable资源的推荐方法:这两种资源同时引入Java,以便它们能够协同工作。
这样做可以隐式地帮助实现(推荐的)规则,即只有负责创建或打开某物的代码才负责处理或关闭它:如果一个方法被传递给OutputStream,它就永远不应该close()它。相反,它应该依赖于调用者关闭它。如果没有一个方法显式调用close(),则保证代码不会抛出异常(例如java.net.SocketException),因为它试图使用已关闭的资源。
这样做可以确保资源精确地关闭一次。请注意,通常关闭一个AutoCloseable不止一次是不安全的:close()操作是,而不是,保证是幂等的。
https://stackoverflow.com/questions/56112598
复制相似问题