Java7的try-with-resources声明(转)
时间:2022-07-23
本文章向大家介绍Java7的try-with-resources声明(转),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
看《Effective Java》第三版的时候,看到了其中建议将try-finally
替换为try-with-resources
。这个语法糖还算有意思,特此成文。
用法辨析
Java库中有很多资源需要手动关闭,比如InputStream、OutputStream、java.sql.Connection等等。在此之前,通常是使用try-finally
的方式关闭资源;Java7之后,推出了try-with-resources
声明来替代之前的方式。 try-with-resources
声明要求其中定义的变量实现 AutoCloseable 接口,这样系统可以自动调用它们的close方法,从而替代了finally中关闭资源的功能。
举个栗子,下面是一个复制文件的方法,按照原本try-catch-finally
的写法:
// 一个简单的复制文件方法。
public static void copy(String src, String dst) {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(src);
out = new FileOutputStream(dst);
byte[] buff = new byte[1024];
int n;
while ((n = in.read(buff)) >= 0) {
out.write(buff, 0, n);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
可以看出,这种实现非常的丑陋。
下面来看使用了try-with-resources
后的效果:
public static void copy(String src, String dst) {
try (InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst)) {
byte[] buff = new byte[1024];
int n;
while ((n = in.read(buff)) >= 0) {
out.write(buff, 0, n);
}
} catch (IOException e) {
e.printStackTrace();
}
}
try-with-resources
将会自动关闭try()
中的资源,并且将先关闭后声明的资源。
如果不catch IOException就更加清爽了:
public static void copy(String src, String dst) throws IOException {
try (InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst)) {
byte[] buff = new byte[1024];
int n;
while ((n = in.read(buff)) >= 0) {
out.write(buff, 0, n);
}
}
}
原理分析
那么try-with-resources
有什么神奇之处呢?到底做了什么呢?
我们先来看下AutoCloseable
接口:
public interface AutoCloseable {
void close() throws Exception;
}
其中仅有一个close方法,实现AutoCloseable接口的类将在close方法中实现其关闭资源的功能。
而try-with-resources
其实是个语法糖,它将在编译时编译成关闭资源的代码。我们将上述例子中的代码编译成class文件,再反编译回java文件,就能看到如下代码
public static void copy(String var0, String var1) throws IOException {
FileInputStream var2 = new FileInputStream(var0);
Throwable var3 = null;
try {
FileOutputStream var4 = new FileOutputStream(var1);
Throwable var5 = null;
try {
byte[] var6 = new byte[1024];
int var7;
while((var7 = var2.read(var6)) >= 0) {
var4.write(var6, 0, var7);
}
} catch (Throwable var29) {
var5 = var29;
throw var29;
} finally {
if (var4 != null) {
if (var5 != null) {
try {
// 关闭FileOutputStream
var4.close();
} catch (Throwable var28) {
var5.addSuppressed(var28);
}
} else {
var4.close();
}
}
}
} catch (Throwable var31) {
var3 = var31;
throw var31;
} finally {
if (var2 != null) {
if (var3 != null) {
try {
// 关闭FileInputStream
var2.close();
} catch (Throwable var27) {
var3.addSuppressed(var27);
}
} else {
var2.close();
}
}
}
}
除却处理异常相关的代码,其实就是调用了资源的close方法。
不过不得不说这个语法糖挺甜,真香。
- Android Studio 错误集
- Linux 优化
- 基于重叠IO模型的 回显TCP服务器设计
- Git常用命令
- 手把手教你搭建SpringMVC——最小化配置
- Mysql-16-缓存的配置和使用
- 重叠(Overlapped)IO模型
- Mysql-15-mysql分布式应用
- 基于Spring Mvc实现的Excel文件上传下载
- Java程序员的日常—— Arrays工具类的使用
- Mysql-14-mysql的日志管理
- ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
- Java程序员的日常 —— static的用法讲解实践
- WSAEventSelect模型 ---应用实例,重写TCP服务器实例
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- SpringMVC在web.xml中的配置(引入springmvc)
- springmvc使用DELETE|PUT请求
- Mybatis缓存相关的知识
- 「2020最新」Spring最易学习教程—第一个Spring程序
- idea背景图片及简化插件
- 「2020最新」Spring最易学习教程—IOC 以及 整合Struts2
- SpringBoot整合Mybatis增删改查
- JavaWeb之Maven
- Mirages主题帮助文档
- Java作业-租车小系统
- 「2020最新」Spring最易学习教程 3— 代理设计模式 Spring AOP 动态代理原理
- 初入Mybatis:简介及配置
- Java多线程安全问题
- ajax、axios、fetch三者之间
- Spring Boot项目 Build 不生效的问题