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工具类,以及使用它们在处理集合时的改进 ...
随机推荐
- tensorflow 数据集对象(tf.data)的使用( tf.data.Dataset 、tf.data.TextLineDataset 、 tf.data.TFRecordDataset ) 示例
tensorflow 使用数据集(tf.data)的方法对数据集进行操纵. 1. 对 数组(内存向量) 进行操纵 : import tensorflow as tf input_dat ...
- "观察者" 网站上不错的对社会问题进行思考的文章--------------- 分享
原文地址: https://www.guancha.cn/weichengling 在网上无意中到了下面的文章,对社会热点问题有较为全面的思考,感觉不错,分享一下. ------------ ...
- Ubuntu18.04 系统环境下 vscode中忽略pylint某些错误或警告
相关: ubuntu18.04系统环境下使用vs code安装pylint检查python的代码错误 ====================================== 假设已经在前文(ht ...
- 【转载】联合发布|面向眩晕诊疗的中文医疗对话大模型MedChat发布!
原文地址: https://mp.weixin.qq.com/s/XrddDDpDXHKBcEueH8YXcA ============================================ ...
- baselines算法库common/vec_env/subproc_vec_env.py模块分析
模块代码: import multiprocessing as mp import numpy as np from .vec_env import VecEnv, CloudpickleWrappe ...
- AQS源码解读之ReentrantLock-图解
1.背景 1.AQS简介AQS全称为AbstractQueuedSynchronizer(抽象队列同步器).AQS是一个用来构建锁和其他同步组件的基础框架,使用AQS可以简单且高效地构造出应用广泛的同 ...
- java 栈与队列
Java中的栈与队列 一.栈(Stack) 1.1 介绍 栈是一种后进先出(LIFO,Last In First Out)的数据结构.在栈中,元素的插入和删除操作都是在栈顶进行的.Java中的java ...
- B. BerSU Ball
B. BerSU Ball 排序后考虑\(dp\),\(dp_{i,j}\)表示前\(i\)个男生和前\(j\)个女生能匹配的最大数. \[\begin{aligned} if(|a_i - b_j| ...
- 手把手教你ubuntu下移植MJPG-streamer
一.嵌入式视频图像开源库 在嵌入式系统中,常用的视频图像处理开源系统有:luvcview.cheese.motion.mjpg-streamer或者ffmpeg,其中: • luvcview: 基于V ...
- Snap 使用
Snap 是一个或多个应用程序的捆绑包,可在许多不同的 Linux 发行版中使用,无需依赖或修改.Snap 可从 Snap Store(一个拥有数百万用户的公共应用程序商店)中发现和安装.很多常用的软 ...