JDK1.7中关于AutoCloseable接口的使用

  1.查看API文档,找到AutoCloseable相关定义

public interface AutoCloseable

    该接口是从JDK1.7开始引入,并且该接口中只有一个方法close()

1 void close() throws Exception // 关闭此资源,放弃任何潜在资源

  2.测试AutoCloseable接口,实现自动关闭处理

  2.1新建接口IMessage继承AutoCloseable接口

1 interface IMessage extends AutoCloseable {
2     public void send(); //消息发送
3 }

   2.2新建NetMessage类实现IMessage接口(注意13行:close()方法抛出异常)

 1 class NetMessage implements IMessage { //实现消息的处理机制
 2     private String msg;
 3 
 4     public NetMessage(String msg) {
 5         this.msg = msg;
 6     }
 7 
 8     public boolean open() { // 获取资源连接
 9         System.out.println("【OPEN】获取资源发送连接资源");
10         return true;
11     }
12 
13     public void close() throws Exception {
14         System.out.println("【CLOSE】关闭消息发送通道");
15     }
16 
17     @Override
18     public void send() {
19         if (this.open()) {
20             System.out.println("【**发送消息**】" + this.msg);
21         }
22     }
23 }

  2.3 测试类

1 try (IMessage message = new NetMessage("Hello world")) {
2   message.send();
3 } catch (Exception e) {
4   e.printStackTrace();
5 }

   2.4运行结果

【OPEN】获取资源发送连接资源
【**发送消息**】Hello world
【CLOSE】关闭消息发送通道

   3.以FileWriter为例,比较两种不同的操作方式:

  3.1.JDK1.7之前,在finally块中手工关闭资源

 1     public static void writeFile(String str) {
 2         FileWriter fw = null;
 3         try {
 4             fw = new FileWriter("E://test.txt", true);
 5             fw.write(str);
 6         } catch (IOException e) {
 7             e.printStackTrace();
 8         } finally {
 9             if (fw != null) {
10                 try {
11                     fw.close();
12                 } catch (IOException e) {
13                     e.printStackTrace();
14                 }
15             }
16         }
17     }

 存在问题:

  • 开发过程中可能会忘记关闭一些资源,导致内存泄漏;
  • 关闭代码的逻辑较冗长,可读性比较差。

   3.2.JDK1.7之后,使用AutoCloseable进行自动关闭

1     public static void newWriteFile(String str) {
2         try (FileWriter fw = new FileWriter("", true)) {
3             fw.write(str);
4         } catch (IOException e) {
5             e.printStackTrace();
6         }
7     }

  可以通过查看API文档,在AutoCloseable中查看所有已知的实现类;这里以FileWriter为例: 

  • 点击FIleWriter,查看内部实现:
public class FileWriter extends OutputStreamWriter
  • 点击OutputStreamWriter,继承抽象类Writer:
public class OutputStreamWriter extends Writer
  • 点击Writer,其中实现了Closeable接口:
public abstract class Writer implements Appendable, Closeable, Flushable 
  • 点击Closeable接口,查看内部实现,发现该接口继承AutoCloseable接口(该接口只有close()方法):
public interface Closeable extends AutoCloseable

 总结:

  • AutoCloseable从1.7版本开始引入;
  • AutoCloseable只有一个方法close(),并且抛出异常;
  • 实现AutoCloseable自动关闭资源:

    1.接口继承AutoCloseable接口(或者类实现AutoCloseable接口);

    2.结合异常处理语句:try()...catch()实现自动关闭处理。

   

其他结论

  1.JDK1.7之前,通常使用 try...catch()捕获异常,在finally部分关闭IO流等,但JDK1.7之后,Java7的编译器和运行环境支持新的try-with-resources语句(ARM块,自动资源管理),写在()里面的对象对应的类实现了自动关闭接口AutoCloseable。

  2.对于实现AutoCloseable接口的类的实例,将其放到try后面(带资源的try语句),在try(){}结束的时候会自动将这些资源关闭(调用close()方法)。

  3.带资源的try语句的3个关键点:

  •   由带资源的try语句管理的资源必须是实现了AutoCloseable接口的类的对象;
  •   在try语句中声明的资源被隐式声明为final;
  •   通过分号分隔每个声明可以管理多个资源。

文中部分内容和结论依据其它资料进行整理修改,若存在不妥之处,还请留言指正。 

原文地址:https://www.cnblogs.com/moreforests/p/13470297.html