实现可关闭或实现自动关闭

2022-08-31 07:17:35

我正在学习Java,我无法在接口上找到任何很好的解释。implements Closeableimplements AutoCloseable

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

我可以在没有接口的情况下关闭流。但是,我无法理解如何使用接口实现该方法。而且,此接口的目的是什么?pw.close();close()

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

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

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 {


}

答案 1

AutoCloseable(在 Java 7 中引入)使得使用 try-with-resources 习语成为可能:

public class MyResource implements AutoCloseable {

    public void close() throws Exception {
        System.out.println("Closing!");
    }

}

现在你可以说:

try (MyResource res = new MyResource()) {
    // use resource here
}

JVM 将自动为您调用。close()

Closeable是一个较旧的界面。出于某种原因为了保持向后兼容性,语言设计人员决定创建一个单独的语言。这不仅允许在 try-with-resources 中使用所有类(如流抛出),还允许从 中抛出更常规的已检查异常。CloseableIOExceptionclose()

如有疑问,请使用 ,您班级的用户将不胜感激。AutoCloseable


答案 2

Closeable 扩展了 AutoCloseable,并且专门专用于 IO 流:它抛出而不是 ,并且是幂等的,而不提供此保证。IOExceptionExceptionAutoCloseable

这一切都在两个接口的javadoc中进行了解释。

实现(或)允许将类用作Java 7中引入的尝试资源构造的资源,这允许在块的末尾自动关闭此类资源,而不必添加显式关闭资源的块。AutoCloseableCloseablefinally

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


推荐