实现Closeable或实现AutoCloseable

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

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

我可以使用pw.close();closuresstreampw.close(); 没有界面。 但是,我不明白如何使用接口来实现close()方法。 而且,这个接口的目的是什么?

另外我想知道:如何检查IOstream是否真的closures?

我正在使用下面的基本代码

 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 { } 

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

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

在你的实现中,调用pw.close()就足够了。 你应该在最后一个块里做到这一点:

 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相关的。 在Java 7中,这可以做得更加优雅(见这个答案 )。

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 res here } 

而JVM会自动为你调用close()Closeable是一个较老的界面。 因为某些原因 为了保持向后兼容,语言devise者决定创build一个独立的语言。 这样,不仅所有可Closeable类(比如抛出IOExceptionstream)都可以在try-with-resources中使用,而且还可以从close() Closeable更常规的检查exception。

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

Closeable扩展AutoCloseable ,专门用于IOstream:抛出IOException而不是exception,并且是幂等的,而AutoCloseable不提供这种保证。

这两个接口的javadoc都解释了这一点。

实现AutoCloseable(或Closeable)允许一个类作为Java 7中引入的try-with-resources构造的资源,它允许在一个块的末尾自动closures这些资源,而不必添加一个closures的finally块资源明确。

你的类不代表一个可closures的资源,而且实现这个接口绝对没有意义:一个IOTest不能被closures。 它甚至不可能实例化,因为它没有任何实例方法。 请记住,实现一个接口意味着类和接口之间存在一种关系。 你在这里没有这种关系。

这是一个小例子

 public class TryWithResource { public static void main(String[] args) { try (TestMe r = new TestMe()) { r.generalTest(); } 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 "); } } 

try-with-resources声明。

try-with-resources statement是声明一个或多个资源的try语句。 resource是程序结束后必须closures的对象。 try-with-resources statement确保每个资源在语句结束时closures。 任何实现java.lang.AutoCloseable对象(包含所有实现java.io.Closeable对象)都可以用作资源。

以下示例从文件读取第一行。 它使用BufferedReader的实例从文件中读取数据。 BufferedReader是程序完成后必须closures的资源:

 static String readFirstLineFromFile(String path) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } } 

在这个例子中,在try-with-resources语句中声明的资源是一个BufferedReader。 声明语句出现在try关键字之后的括号内。 Java SE 7及更高版本中的类BufferedReader实现了接口java.lang.AutoCloseable 。 由于BufferedReader实例是在try-with-resource语句中声明的,因此无论try语句是正常还是突然完成(由于BufferedReader.readLine抛出IOException ),它都将被closures。

在Java SE 7之前,无论try语句是正常还是突然完成,都可以使用finally块来确保closures资源。 下面的例子使用了一个finally块,而不是try-with-resources语句:

 static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { if (br != null) br.close(); } } 

请参阅文档 。

做一件事情!在close方法里面明确地写一个o / p控制台状态。在另外一个类中做try-with-resource,比如做一个你的资源的实例,放在try-with-resource声明子句中。你会注意到资源执行后自动closures!!声明是打印的!