JDK1.7中关于AutoCloseable接口的使用

摘要:
3.带资源的try语句的3个关键点:  由带资源的try语句管理的资源必须是实现了AutoCloseable接口的类的对象;  在try语句中声明的资源被隐式声明为final;  通过分号分隔每个声明可以管理多个资源。

1.查看API文档,找到AutoCloseable相关定义

public interface AutoCloseable

该接口是从JDK1.7开始引入,并且该接口中只有一个方法close()

1 void close() throws Exception //关闭此资源,放弃任何潜在资源

2.测试AutoCloseable接口,实现自动关闭处理

2.1新建接口IMessage继承AutoCloseable接口

1 interface IMessage extendsAutoCloseable {
2     public void send(); //消息发送
3 }

2.2新建NetMessage类实现IMessage接口(注意13行:close()方法抛出异常)

1 class NetMessage implements IMessage { //实现消息的处理机制
2     privateString msg;
3 
4     publicNetMessage(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() throwsException {
14         System.out.println("【CLOSE】关闭消息发送通道");
15 }
16 
17 @Override
18     public voidsend() {
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 voidwriteFile(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 voidnewWriteFile(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接口的使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇windows和ubuntu 10.4双启动顺序用PHP和Ajax进行前后台数据交互——以用户登录为例下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

RobotFramework下的http接口自动化Set Request Header 关键字的使用

Set Request Header 关键字用来设置http请求时的请求头部信息。 该关键字接收两个参数,[ header_name | header_value ] 示例1:设置http请求时的Referer(Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基...

为什么Editor类型模块中导出的蓝图接口在蓝图编辑器中无法使用—及代码位于引擎不同文件夹的意义

一、问题在UE中添加一些简单的蓝图接口,然后在蓝图编辑器中始终无法找到对应节点,无论是否勾选"Context Sensitive"。因为实现代码非常简单,简单到没有出错的可能,所以就觉得很神奇。好在尽管有很多乱七八糟的干扰信息,但是网上还是有答案https://forums.unrealengine.com/t/c-blueprint-function-n...

JAR包升级,我们关注啥

我们在测试过程中,经常面临JAR包升级的情况,那么在JAR包升级过程中,我们应该关注哪些东西呢? 什么是JAR包?? Java Archive,Java 归档文件。jar的文件格式与平台无关,它允许将许多文件组合成一个压缩文件。JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。 a.用于发...

Java安全之Axis漏洞分析

Java安全之Axis漏洞分析 0x00 前言 看到个别代码常出现里面有一些Axis组件,没去仔细研究过该漏洞。研究记录一下。 0x01 漏洞复现 漏洞版本:axis=<1.4 Axis1.4 freemarker 下载Axis包1.4版本将Axis放到tomcat的webapp目录中。freemarker.jar放到Axis的 lib目录下。运行t...

vue中使用axios对同一个接口连续请求导致返回数据混乱的问题

项目中遇到该问题,记录一下 需求是连续请求5次同一个接口,但是参数不一样。最开始使用 forEach 接口循环调用接口,发现有时候先请求的比后请求的返回数据慢,导致数据顺序混乱,所以需要控制请求的顺序。 因为需要将5次数据拿到依次放入指定的数组中。 这里就使用到了 Promise.all getLawhelpMethod(){             ...

【转载】python接口测试实战-Fiddler、Postman

本节内容 抓包工具的使用 Postman的使用 抓包工具的使用 抓包工具简介 Chrome/Firefox 开发者工具: 浏览器内置,方便易用 Fiddler/Charles: 基于代理的抓包,功能强大,可以手机抓包,模拟弱网,拦截请求,定制响应 Fiddler: 免费,只支持Win Charles: 收费,支持Win/Linux/Mac...