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;
- 通过分号分隔每个声明可以管理多个资源。
文中部分内容和结论依据其它资料进行整理修改,若存在不妥之处,还请留言指正。
JDK1.7中关于AutoCloseable接口的使用的更多相关文章
- Java: AutoCloseable接口
K7 增加了一些新特性,其中报错AutoCloseable 等.新特性包括如下,下面主要说说AutoCloseable . 在JDK7 中只要实现了AutoCloseable 或Closeable 接 ...
- 如何在JDK1.8中愉快地处理日期和时间
如何在JDK1.8中愉快地处理日期和时间 JDK1.8新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了. ...
- JDK1.7 中的HashMap源码分析
一.源码地址: 源码地址:http://docs.oracle.com/javase/7/docs/api/ 二.数据结构 JDK1.7中采用数组+链表的形式,HashMap是一个Entry<K ...
- Jdk1.8中的HashMap实现原理
HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. HashM ...
- java中的标记接口(标签接口)
Java中的标记接口(Marker Interface),又称标签接口(Tag Interface),具体是不包含任何方法的接口.在Java中很容易找到标记接口的例子,比如JDK中的Serialzab ...
- JDK1.8中如何用ScriptEngine动态执行JS
JDK1.8中如何用ScriptEngine动态执行JS jdk1.6开始就提供了动态脚本语言诸如JavaScript动态的支持.这无疑是一个很好的功能,毕竟Java的语法不是适合成为动态语言.而JD ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
- 【1】Jdk1.8中的HashMap实现原理
HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 内部实现 ...
- JDK1.7中的ThreadPoolExecutor源代码剖析
JDK1. 7中的ThreadPoolExecutor 线程池,顾名思义一个线程的池子,池子里存放了非常多能够复用的线程,假设不用线程池相似的容器,每当我们须要创建新的线程时都须要去new Threa ...
- JDK1.8新特性——Collector接口和Collectors工具类
JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...
随机推荐
- C语言编写Linux终端环境下无缓冲键盘输入 ,并识别上下左右光标键
自己重构了游戏<2048>并且重构了它的最好启发式AI解法,并上传到了Gitee中的 鬼&泣 / 2048-heuristic的devilmaycry分支,在这个过程中编写了一个C ...
- 再探 游戏 《 2048 》 —— AI方法—— 缘起、缘灭(4) —— state-of-the-art
<2048>游戏在线试玩地址: https://play2048.co/ 该游戏的解法比较不错的资料为外网的一个讨论帖子: What is the optimal algorithm fo ...
- DophinScheduler 如何定期删除日志实例?
转载自东华果汁哥 Apache DophinScheduler 运行一段时间后,实例调度日志越来越多,需要定期清理. SQL 错误 [1701] [42000]: Cannot truncate a ...
- springcloud线上发布超时之grpc
springcloud线上发布超时系列文章: springcloud线上发布超时之feign(ribbon饥饿加载) springcloud线上发布超时之grpc springcloud线上发布超时方 ...
- ARM汇编:MRS和MSR指令
1.MSR和MRS指令介绍 MRS 指令: 对状态寄存器CPSR和SPSR进行读操作.通过读CPSR可以获得当前处理器的工作状态.读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有 ...
- Linux C基础——” Makefile “ 文件管理大师你拜访过嘛?
Make简介: 工程管理器,顾名思义,是指管理较多的文件 Make工程管理器也就是个"自动编译管理器",这里的"自动"是指它能够根据文件时间戳自动发现更新过的文 ...
- linux驱动、ARM学习环境搭建
安装包也可以关注公众号:一口Linux 后台回复 :ubuntu 0.环境说明 通常安装1个可以编译ARM汇编代码的linux环境,需要安装以下3个软件: vmware:在该软件中可以安装其他操作系统 ...
- 互联工厂数据交换标准:IPC-CFX
大家好,我是Edison. 全球电子制造主要集中在中国,面向未来工业4.0.中国制造2025的战略转型升级,互联互通是基础.数据是核心,如何从用户角度来定义设备加工数据的内容完整性.有效性.可扩展性将 ...
- 使用 Docker 部署 FRP
服务端 编写配置文件 vim ~/.config/frp/frps.toml bindPort = 7000 # Web Dashboard [webServer] addr = "0.0. ...
- 一个Java类在运行时候,变量是怎么在JVM中分布的呢?
JVM学习第三篇思考:一个Java类在Jvm内存中是怎么存在的 又名:Java虚拟机的内存模型(JMM)是什么样的. 通过前面两篇文章的学习,我们知道了一个Java类的生命周期及类加载器.我们可以得到 ...