关闭Java中的资源

时间:2012-12-07 15:36:06

标签: java java-6

我目前在java中做这样的事情来释放资源。我是否需要在BufferedWriter对象上调用close或者在析构函数中调用它?关于Resource1和Resource2,我必须尊重发布和免费。这是嵌套trys的正确方法吗? Python有一个非常好的“with statement”,它将资源与代码范围相关联。 java有喜欢吗?

Resource1 r1 = new Resource1();
try
{
    ...
    Resource2 r1 = new Resource2();
    try
    {
        ...
        java.io.BufferedWriter f = new java.io.BufferedWriter(new java.io.FileWriter(new java.io.File("f")));
        try
        {
           ...
        }
        finally
        {
           f.close(); 
        }
    }
    finally
    {
        r2.release(); 
    }
}
finally
{
    r1.free(); 
}

更新 我正在使用Java 1.6

2 个答案:

答案 0 :(得分:3)

您对BufferedWriter的看法是正确的。

但是,您可能希望吞下close期间发生的任何异常。这很烦人但很必要。通常使用以下模式:

BufferedWriter f = null;
try {
  f = new BufferedWriter(...);
  ...
}
finally {
  try {
    if(f != null) {
      f.close();
    }
  }
  catch(IOException e) {
    // Nothing can be done, except maybe log it.
  }
}

IOUtils.finallyClose()可用于消除关闭时捕获的需要。

Java doesn't quite have析构函数的概念,但它确实有finalize()在对象被垃圾收集时调用。您应该从不依靠finialize()关闭或以其他方式清理对象。

顺便说一下,Java 7 introduced是关闭实现Closeable的对象的更短语法。

try (BufferedWriter f = new BufferedWriter(new FileWriter(new File("f"))) {
  ...
}

编辑:我最终扩展了......关闭。

答案 1 :(得分:2)

您需要自己关闭文件句柄和其他类似的资源。依靠终结器来做这件事是一种糟糕的方法。