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. 【转载】 传统PID算法解决不了的情况,应该怎么办?

    原文地址: http://www.51hei.com/bbs/dpj-152844-1.html --------------------------------------------------- ...

  2. (摘抄) 源码分析multiprocessing的Value Array共享内存原理

    原文地址: http://xiaorui.cc/archives/3290 ============================================================ 摘 ...

  3. 硬盘测速工具中的队列深度是个什么东西——CrystalDiskMark中的Q32T16是什么意思

    ================================ 最近有使用CrystalDiskMark给自己的硬盘做测速,发现有个名词自己不是很理解,就是像Q32T16这样的词: 在网上找了好久, ...

  4. nvme硬盘的断电保护是否有用,是噱头、智商税还是真的有需要?购买DOCKCASE智能M2固态硬盘盒10秒保护

    最近在某东上买了一个10秒断电保护的nvme硬盘,其实对于这个断电保护有用没有用我是不懂的,也是不care的,买这个硬盘盒主要就是为了这个屏幕去的,不过东西到手后我就开始思考这个断电保护到底有用没有用 ...

  5. 白鲸开源CEO郭炜在2024 DataOps发展大会上获聘专家

    2024年5月15日,白鲸开源CEO郭炜在2024 DataOps发展大会上被正式聘任为DataOps专家,并获得了荣誉证书.本次大会由中国通信标准化协会主办,中关村科学城管委会提供支持,大数据技术标 ...

  6. [计算机网络] IPv6

    1 IPv6 概述 引言 近期突发奇想,能不能用 IPv6 的公网地址,给家里的 NAS 做 内网穿透. 技术上是可行的.只是必须确保是 IPv6 的公网地址. 大学学的 IPv6 的知识,早就抛到九 ...

  7. zabbix 二次开发(添加menu)

    zabbix 二次开发--- 在zabbix菜单栏中增加 CMDB 菜单,该菜单下有个子栏目 CMDB overview,如图: 实现此效果,我们需要修改两个地方:menu.inc.php 和 mai ...

  8. Chrome 浏览器远程调试 【转】

    Chrome 浏览器按F12,可以调试JS,分析HTTP包等.但是有时候需要远程调试. 比如,某个EXE它内部嵌套了浏览器的话,可以想办法打开它的远程调试功能,然后在外部连到这个地址,就能分析它的ht ...

  9. mysql 死锁原因及解决办法

    Mysql 锁类型 一.锁类型介绍: MySQL 有三种锁的级别:页级.表级.行级. 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出 ...

  10. 第二章:智能Agent

    第二章:智能Agent 本章讨论Agent的本质,Agent是否完美,环境的多样性,及由此带来的各种Agent分类. 1. Agnet和环境 Agent通过传感器感知环境并通过执行器对所处环境产生影响 ...