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框架的jit中快速的实现循环结构 —— Jax框架的jit编译是否可以使用循环结构

    相关: Jax框架的jit编译是否可以使用循环结构,如果使用循环结构需要注意什么 前文中给出了jit下使用python做循环结构的代码,下面再次给出这个代码,这个代码为jupyter-notebook ...

  2. rllab —— 强化学习 算法模块库 (环境配置失败!!!) (已经不进行维护更新,已被淘汰,由于一些老旧代码还有可能关联因此fork了下,复制了份原始项目)

    代码地址: https://gitee.com/devilmaycry812839668/rllab 由于官方代码地址在github上,外网偶尔会出现网络连接中断的问题因此在国内代码库中fork了一个 ...

  3. baselines算法库common/retro_wrappers.py模块分析

    retro_wrappers.py模块代码: from collections import deque import cv2 cv2.ocl.setUseOpenCL(False) from .at ...

  4. SMU Summer 2023 Contest Round 14

    SMU Summer 2023 Contest Round 14 A. Potion-making 就是解一个\(\frac{i}{i + j} = \frac{k}{100}\)方程,然后循环暴力找 ...

  5. PLC开发没有前景想转行嵌入式,找个培训机构还是自学?

    0. 粉丝提问 把粉丝的情况和问题总结起来,主要以下几点: 这位粉丝19年毕业,25岁,专业是是自动化,之前从事plc开发,现在在自学单片机,想转行做Linux相关开发 犹豫是自学还是报线下培训班? ...

  6. C语言之父和Linux之父谁更伟大?

    前言 在计算机软件领域,做出过重大贡献的神人很多,比如:<计算机程序设计艺术>(The Art of Computer Programming)一书的作者- Donald Knuth:Pa ...

  7. 一加8t救砖教程

    关机 按住音量上下和电源键 重启到fastboot 取到原系统boot ./fastboot flash boot_a boot.img ./fastboot flash boot_b boot.im ...

  8. Wordpress 建立公司网站

    1. 先安装好wordpress wordpress 6.4.2-php8.1-fpm-alpine php8.1 Login to wordpress http://www.hei-ya.com/w ...

  9. C#自定义控件—指示灯

    C#用户控件之指示灯 在体现通讯状态.运行状态等用一个靓眼的指示灯如何做? 思路(GDI) 外环用笔绘制(Pen),内圆用画刷(SolidBrush); 两个方法(用笔画圆,用画刷填充圆的内部): 绘 ...

  10. CSIG青年科学家会议圆满举行,合合信息打造智能文档处理融合研究新范式

          近期,第十九届中国图象图形学学会青年科学家会议(简称"会议")在广州召开.会议由中国图象图形学学会(CSIG)主办,琶洲实验室.华南理工大学.中山大学.中国图象图形学学 ...