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;
  •   通过分号分隔每个声明可以管理多个资源。

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

JDK1.7中关于AutoCloseable接口的使用的更多相关文章

  1. Java: AutoCloseable接口

    K7 增加了一些新特性,其中报错AutoCloseable 等.新特性包括如下,下面主要说说AutoCloseable . 在JDK7 中只要实现了AutoCloseable 或Closeable 接 ...

  2. 如何在JDK1.8中愉快地处理日期和时间

    如何在JDK1.8中愉快地处理日期和时间 JDK1.8新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了. ...

  3. JDK1.7 中的HashMap源码分析

    一.源码地址: 源码地址:http://docs.oracle.com/javase/7/docs/api/ 二.数据结构 JDK1.7中采用数组+链表的形式,HashMap是一个Entry<K ...

  4. Jdk1.8中的HashMap实现原理

    HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. HashM ...

  5. java中的标记接口(标签接口)

    Java中的标记接口(Marker Interface),又称标签接口(Tag Interface),具体是不包含任何方法的接口.在Java中很容易找到标记接口的例子,比如JDK中的Serialzab ...

  6. JDK1.8中如何用ScriptEngine动态执行JS

    JDK1.8中如何用ScriptEngine动态执行JS jdk1.6开始就提供了动态脚本语言诸如JavaScript动态的支持.这无疑是一个很好的功能,毕竟Java的语法不是适合成为动态语言.而JD ...

  7. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  8. 【1】Jdk1.8中的HashMap实现原理

    HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 内部实现 ...

  9. JDK1.7中的ThreadPoolExecutor源代码剖析

    JDK1. 7中的ThreadPoolExecutor 线程池,顾名思义一个线程的池子,池子里存放了非常多能够复用的线程,假设不用线程池相似的容器,每当我们须要创建新的线程时都须要去new Threa ...

  10. JDK1.8新特性——Collector接口和Collectors工具类

    JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...

随机推荐

  1. Jax报错:Windows系统环境下WSL中运行Jax会导致nvidia-smi报错退出,无法使用nvidia-smi和gpustat

    环境: Window11下的WSL: 运行jax,导致nvidia-smi无法使用,不过经过测试发现虽然nvidia-smi报错无法使用,但是GPU已经可以正常使用,调用jax的GPU运行也保持正常, ...

  2. (待续)【转载】 Deep Reinforcement Learning Doesn't Work Yet(这里有一篇深度强化学习劝退文)

    原文: https://www.alexirpan.com/2018/02/14/rl-hard.html ============================================== ...

  3. 微信支付java版(含视频讲解)

    1.背景 实际开发中用到微信支付的概率非常大, 至于为什么这里不必要我多少...... 微信支付大体需要对接的核心接口有 其实大部分支付都是这些,就像上一节我们讲的支付宝支付一样 这里以常用的H5支付 ...

  4. 用户案例 | Apache DolphinScheduler 离线调度在自如多业务场景下的应用与实践

    用户案例 | 自如 随着自如业务的快速发展,不断增长的调度任务和历史逾万的存量任务对平台稳定性提出了更高的要求.同时,众多非专业开发人员也需要一种更为"亲民"的调度平台使用体验. ...

  5. ApplicationRunner的讲解

    在开发中可能会有这样的情景.需要在容器启动的时候执行一些内容.比如读取配置文件,数据库连接之类的.SpringBoot给我们提供了两个接口来帮助我们实现这种需求.这两个接口分别为CommandLine ...

  6. 21-canvas事件监听

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  7. 2023 ICPC 合肥游记

    board zsy 11.24 开始嗓子疼了,但可以忍受.晚上睡的很不舒服 11.25 起床就开始难受,还得骑车到地铁站,应该打个车来着.不过路上拍到了很好看的朝霞(写到这里才想起来还没发朋友圈给 t ...

  8. 链接器 ld 名称的由来

    Linker 通常缩写为 LD,这是因为在 Unix 和类 Unix 系统中,ld 是链接器的常用命令名称.这个命名可以追溯到 Unix 系统的早期发展历史. 历史背景 Unix 早期:在 Unix ...

  9. 微信小程序之无需服务端支持实现内容安全检查

    微信小程序之无需服务端支持实现内容安全检查 微信小程序审核未通过,原因如下: 为避免您的小程序被滥用,请你完善内容审核机制,如调用小程序内容安全API,或使用其他技术.人工审核手段,过滤色情.违法等有 ...

  10. 网站由http升级为https图文教程

    网站由http升级为https图文教程 本文是基于凯哥个人网站由http升级为https的记录. 前提说明:凯哥网站在AliYun备案的.所以基于此创建的.如果是腾讯云备案的域名也是类似的. 名词解释 ...