首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现Closeable或实现AutoCloseable

实现Closeable或实现AutoCloseable
EN

Stack Overflow用户
提问于 2012-10-30 22:36:48
回答 5查看 139K关注 0票数 155

我正在学习Java的过程中,我找不到关于implements Closeableimplements AutoCloseable接口的任何好的解释。

当我实现interface Closeable时,我的Eclipse IDE创建了一个public void close() throws IOException方法。

我可以在没有接口的情况下使用pw.close();关闭流。但是,我不明白如何使用接口实现close()方法。那么,这个接口的用途是什么呢?

另外,我想知道:我如何检查IOstream是否真的关闭了?

我使用的是下面的基本代码

代码语言:javascript
复制
import java.io.*;

public class IOtest implements AutoCloseable {

public static void main(String[] args) throws IOException  {

    File file = new File("C:\\test.txt");
    PrintWriter pw = new PrintWriter(file);

    System.out.println("file has been created");

    pw.println("file has been created");

}

@Override
public void close() throws IOException {


}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-30 22:45:03

在我看来,您对接口不是很熟悉。在您发布的代码中,您不需要实现AutoCloseable

如果您要实现自己的处理文件或任何其他需要关闭的资源的PrintWriter,则只需要(或应该)实现CloseableAutoCloseable

在您的实现中,调用pw.close()就足够了。您应该在finally块中执行此操作:

代码语言:javascript
复制
PrintWriter pw = null;
try {
   File file = new File("C:\\test.txt");
   pw = new PrintWriter(file);
} catch (IOException e) {
   System.out.println("bad things happen");
} finally {
   if (pw != null) {
      try {
         pw.close();
      } catch (IOException e) {
      }
   }
}

上面的代码与Java 6相关。在Java7中,这可以做得更好(参见this answer)。

票数 46
EN

Stack Overflow用户

发布于 2012-10-30 22:46:18

Closeable extends AutoCloseable,专门用于IO流:它抛出IOException而不是Exception,并且是幂等的,而AutoCloseable不提供这种保证。

这在两个接口的javadoc中都有解释。

实现AutoCloseable (或Closeable)允许将类用作Java7中引入的try-with-resources构造的资源,该构造允许在块的末尾自动关闭此类资源,而不必添加显式关闭资源的finally块。

您的类并不表示可关闭的资源,而且实现此接口绝对没有意义:IOTest不能被关闭。它甚至不可能实例化它,因为它没有任何实例方法。请记住,实现接口意味着在类和接口之间存在 is -a关系。你在这里没有这样的关系。

票数 85
EN

Stack Overflow用户

发布于 2017-03-17 20:12:01

下面是一个小示例

代码语言:javascript
复制
public class TryWithResource {

    public static void main(String[] args) {
        try (TestMe r = new TestMe()) {
            r.generalTest();
        } catch(Exception e) {
            System.out.println("From Exception Block");
        } finally {
            System.out.println("From Final Block");
        }
    }
}



public class TestMe implements AutoCloseable {

    @Override
    public void close() throws Exception {
        System.out.println(" From Close -  AutoCloseable  ");
    }

    public void generalTest() {
        System.out.println(" GeneralTest ");
    }
}

下面是输出:

代码语言:javascript
复制
GeneralTest 
From Close -  AutoCloseable  
From Final Block
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13141302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档