JDK9新特性实战:简化流关闭新姿势。
做Java开发的都知道,每个资源的打开都需要对应的关闭操作,不然就会使资源一直占用而造成资源浪费,从而降低系统性能。
关于资源的关闭操作,从JDK7-JDK9有了不少的提升及简化。
JDK6
在JDK6及之前,每个资源都需要我们手动写代码关闭,如:
FileInputStream fis = null;
byte[] buffer = new byte[1024];
try {
fis = new FileInputStream(new File("E:\Java技术栈.txt"));
while (fis.read(buffer) > 0) {
System.out.println(new String(buffer));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
资源打开使用完后,必须在finally块中进行手动关闭!我们有的同事,做一个查询功能点,打开了连接查询完后没有手动关闭,最后造成连接池超出最大连接数而使系统功能堵塞。
JDK7
JDK7发布后,添加了新特性:try-with-resources语句。所有需要关闭的资源只要实现了 java.lang.AutoCloseable
(java.io.Closeable就实现了这个接口)接口就在会程序结束后自动关闭。
如上面的读取文件的流程序用JDK7来写:
byte[] buffer = new byte[1024];
try (FileInputStream fis = new FileInputStream(new File("E:\Java技术栈.txt"))) {
while (fis.read(buffer) > 0) {
System.out.println(new String(buffer));
}
} catch (Exception e) {
e.printStackTrace();
}
所有的资源在 try()
里面定义,并去掉了finally模块。
下面我们来写一个自定义的流来看看是否自动关闭了。
定义一个自定义输入输出流
class MyInputStream implements AutoCloseable {
void read(String content) {
System.out.println("read content " + content);
}
@Override
public void close() throws Exception {
System.out.println("input stream is closed.");
}
}
class MyOutputStream implements AutoCloseable {
void write(String content) {
System.out.println("write content " + content);
}
@Override
public void close() throws Exception {
System.out.println("out stream is closed.");
}
}
单个资源自动关闭
try (MyInputStream mis = new MyInputStream()) {
mis.read("7_2");
} catch (Exception e) {
e.printStackTrace();
}
输出:
read content 7_2 input stream is closed.
多个资源自动关闭
try()
里面可以定义多个资源,它们的关闭顺序是最后在 try()
定义的资源先关闭。
try (MyInputStream mis = new MyInputStream(); MyOutputStream mos = new MyOutputStream()) {
mis.read("7_3");
mos.write("7_3");
} catch (Exception e) {
e.printStackTrace();
}
输出:
read content 73 write content 73 out stream is closed. input stream is closed.
JDK9
JDK9发布后,又简化了try-with-resources语句的用法。
try()
里面可以是一个变量,但必须是final的或者等同final才行。如下面的mis,mos定义成局部变量可以不用final,局部变量可以等同于final,但定义成成员变量就必须是用final修饰的,不然会编译错误。
MyInputStream mis = new MyInputStream();
MyOutputStream mos = new MyOutputStream();
try (mis; mos) {
mis.read("1.9");
mos.write("1.9");
} catch (Exception e) {
e.printStackTrace();
}
输出:
read content 1.9 write content 1.9 out stream is closed. input stream is closed.
再来看个例子:
Connection dbCon = DriverManager.getConnection("url", "user", "password");
try (dbCon; ResultSet rs = dbCon.createStatement().executeQuery("select * from emp")) {
while (rs.next()) {
System.out.println("In loadDataFromDB() =====>>>>>>>>>>>> " + rs.getString(1));
}
} catch (SQLException e) {
System.out.println("Exception occurs while reading the data from DB ->" + e.getMessage());
}
dbCon和rs都能被自动关闭。
JKD9虽然简化了,但感觉还是没有什么质的变化,实际用途我们可能不希望关心资源的关闭,或者在方法结束之后如果是局部变量它就能自动关闭。或许是我站的高度不够,官方有其他的考量,但JDK9的这一点变化还是非常有用的。
更多JDK9的新功能实战陆续更新,如果觉得有用,分享到朋友圈给更多的人吧!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在Android中查看当前Activity是否销毁的操作
- Android 7.0 运行时权限弹窗问题的解决
- Android加密之全盘加密详解
- Android 实现彻底退出自己APP 并杀掉所有相关的进程
- 使用Android开发接入第三方原生SDK实现微信登录
- Android打包篇:Android Studio将代码打包成jar包教程
- Android系统制作自定义签名的例子
- 抖音短视频系统开发,日期加减
- Android开发之InetAddress基础入门简介与源码实例
- Android实现通讯录功能
- 教你用CentOS7下使用mktorrent制作PT种子
- 让 Python 的高阶函数支持链式调用[实用库/轮子]
- 解决了一个 Python Type Hints 的问题,分享一下
- Elasticsearch:flattened 数据类型 (7.3 发行版新功能)
- Android开发准确获取手机IP地址的两种方式