【问题标题】:Closing resources in Java在 Java 中关闭资源
【发布时间】:2012-12-07 15:36:06
【问题描述】:

我目前正在 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

【问题讨论】:

  • Java 7 已尝试使用资源功能,从您的问题中不清楚您使用的是哪个 Java 版本docs.oracle.com/javase/7/docs/technotes/guides/language/…
  • @djechlin 我已经用谷歌搜索了...
  • @Baz 我将您的问题的标题复制并粘贴到 Google 中,第一个点击是我投票关闭的重复链接。
  • @djechlin 那篇文章非常令人困惑。在两个例子中,异常被吞没了。还有另外两个 cmets/examples 提到你永远不应该吞下一个异常。哪个是对的?对于 Java 1.6,您会使用该帖子中的哪个示例?

标签: java java-6


【解决方案1】:

您对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"))) {
  ...
}

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

【讨论】:

  • 我是 Java 新手,但我以前从未接受过异常。我真的必须这样做吗?不保证 f 是 java.io.BufferedWriter f = ... 行之后的实例吗?
  • 是的(除非您使用新的 Java 7 语法)。有些人批评 Sun 让 close 抛出一个受检异常。我想知道收盘时出了点问题是件好事,但在许多情况下,到那时你无能为力。在几乎所有其他情况下,吞下异常都是一个坏主意。如果您愿意的话,我强烈建议您使用 Java 7。
【解决方案2】:

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

【讨论】:

  • finally block 是为了关闭你的资源,我不明白你的回答
  • 我不是 OP,:P,我不明白你的代码中的 finalizer 是什么意思?
  • Finalizer 是 JRE 在对象被垃圾回收时调用的对象方法。每个对象都有这样的,它通常被覆盖以释放所有附加资源。但是,如果有更多可用内存,您可能会在收集垃圾之前用完句柄。
  • 啊,你的意思是对象类中的 finalize() 方法.. 哈哈,我认为你指的是 finally 块,在这种情况下你的答案是不正确的,无论如何,这是一个正确的答案,+1
猜你喜欢
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多