实现Closeable或实现AutoCloseable
我正在学习Java的过程中,我找不到关于implements Closeable
和implements 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的资源,您只需(或应该)实现Closeable
或AutoCloseable
。
在你的实现中,调用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
类(比如抛出IOException
stream)都可以在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!!声明是打印的!