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 7_3\
write content 7_3\
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的新功能实战陆续更新,如果觉得有用,分享到朋友圈给更多的人吧!
教程:史上最强 Spring Boot & Cloud 教程汇总
扫描关注我们的微信公众号,回复 “666” 可获取一套Java并发编程高清视频教程。
JDK9新特性实战:简化流关闭新姿势。的更多相关文章
- JDK9新特性实战:流关闭新姿势
做Java开发的都知道,每个资源的打开都需要对应的关闭操作,不然就会使资源一直占用而造成资源浪费,从而降低系统性能. 关于资源的关闭操作,从JDK7-JDK9有了不少的提升及简化. JDK6 在JDK ...
- Android Oreo 8.0 新特性实战 Autosizing TextView --自动缩放TextView
Android Oreo 8.0 新特性实战 Autosizing TextView --自动缩放TextView 8.0出来很久了,这个新特性已经用了很久了,但是一直没有亲自去试试.这几天新的需求来 ...
- JDK8新特性关于Stream流
在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: 1 2 3 ...
- Java 8 新特性之 Stream 流基础体验
Java 8 新特性之 Stream 流基础体验 package com.company; import java.util.ArrayList; import java.util.List; imp ...
- Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1Python 3_x 新特性1python3.4新特性1python3.5新特性1值得关注的新特性1Pyth
Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1 Python 3_x 新特性1 python3.4新特性1 python3.5新特性1 值得关注的新特性1 ...
- 重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性
[源码下载] 重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性 作者:webabcd 介 ...
- SQL Server 2016新特性:列存储索引新特性
SQL Server 2016新特性:列存储索引新特性 行存储表可以有一个可更新的列存储索引,之前非聚集的列存储索引是只读的. 非聚集的列存储索引支持筛选条件. 在内存优化表中可以有一个列存储索引,可 ...
- java1.8新特性之stream流式算法
在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: List& ...
- Java8新特性 1——利用流和Lambda表达式操作集合
Java8中可以用简洁的代码来操作集合,比如List,Map,他们的实现ArrayList.以此来实现Java8的充分利用CPU的目标. 流和Lambda表达式都是Java8中的新特性.流可以实现对集 ...
随机推荐
- Python 刷题知识点
if : elif : else : print('{0} \n{1} \n{2}' .format((a + b), (a - b), (a * b))) print(*[num**2 for nu ...
- 【JZOJ6411】上网
description analysis 如果把所有大小关系连成边,小的往大的连,就可以直接上拓扑 暴力连边时间复杂度\(O(n^2)\),然而连边的过程,考虑用线段树优化 线段树上的所有儿子节点向父 ...
- NX二次开发-UFUN工程图插入PNG图片UF_DRF_create_image_from_file
#include <uf.h> #include <uf_drf.h> UF_initialize(); //插入PNG char* file_name = "D:\ ...
- 良田高拍仪集成vue项目
一.硬件及开发包说明: 产品型号为良田高拍仪S1800A3,集成b/s系统,适用现代浏览器,图片使用BASE64数据.开发包的bin文件下的video.flt文件需要和高拍仪型号的硬件id对应,这个可 ...
- Spring-Security (学习记录六)--采用ehcache缓存UserDetails
目录 1. spring-security提供了缓存UserDetails的UserDetailsService实现类. 2. 通过配置来完成缓存 UserDetails (使用ehcache) 3. ...
- EnhanceFunc__增强函数集
想将经常用到的功能函数写在一起,花时间精心维护,然后以后就用起来就舒服很多了 目前就写了进程调试权限,远程线程注入,远程线程释放这三个函数.还有很多功能,以后慢慢加 // last code by g ...
- APC注入DLL(win7下有问题)
void APCKernelRoutine(PKAPC pKAPC, PKNORMAL_ROUTINE pUserAPC, PVOID pContext, PVOID pSysArg1, PVOID ...
- ionic:安装
ylbtech-ionic:安装 1.返回顶部 1. ionic 安装 本站实例采用了ionic v1.3.2 版本,使用的 CDN 库地址: <link href="https:// ...
- LeetCode 197. Rising Temperature (上升的温度)
题目标签: 题目给了我们一个 温度表格,让我们找到 所有温度比之前一天高的,返回id. 建立 Weather w1, Weather w2,找到当w1 的温度 大于 w2 的时候,而且 w1 的日期是 ...
- python爬虫_从零开始破解js加密(一)
除了一些类似字体反爬之类的奇淫技巧,js加密应该是反爬相当常见的一部分了,这也是一个分水岭,我能解决基本js加密的才能算入阶. 最近正好遇到一个比较简单的js,跟大家分享一下迅雷网盘搜索_838888 ...