-1

我目前正在java中做这样的事情来释放资源。我需要在 BufferedWriter 对象上调用 close 还是在析构函数中调用它?关于 Resource1 和 Resource2,我必须恭敬地调用 release 和 free。这是嵌套尝试的正确方法吗?Python 有一个非常好的“with 语句”,它将资源与代码范围相关联。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

4

2 回答 2

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没有析构函数的概念,但它确实有finalize(),当一个对象被垃圾回收时,它会调用 get 。您永远不应依赖finialize()关闭或以其他方式清理对象。

顺便说一句,Java 7引入了一种更短的语法来关闭实现Closeable的对象。

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

编辑:我终于扩展了..close。

于 2012-12-07T15:45:27.997 回答
2

您需要自己关闭文件句柄和其他类似资源。依靠终结器来执行此操作是一种不好的方法。

于 2012-12-07T15:40:11.537 回答