转载自 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);}

    @Overridepublic 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);}

    @Overridepublic 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新特性实战:简化流关闭新姿势相关推荐

  1. JDK9新特性实战:简化流关闭新姿势。

    image 做Java开发的都知道,每个资源的打开都需要对应的关闭操作,不然就会使资源一直占用而造成资源浪费,从而降低系统性能. 关于资源的关闭操作,从JDK7-JDK9有了不少的提升及简化. JDK ...

  2. 跟我学 Java 8 新特性之 Stream 流(二)关键知识点

    转载自   跟我学 Java 8 新特性之 Stream 流(二)关键知识点 我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉.如果你没有实践,我还是再次呼吁 ...

  3. Java8 新特性实战

    Java8 新特性实战 本文来自cowbi的投稿~ Oracle 于 2014 发布了 Java8(jdk1.8),诸多原因使它成为目前市场上使用最多的 jdk 版本.虽然发布距今已将近 7 年,但很 ...

  4. 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局

    转载自   跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局 恭喜你们,马上就要学完Java8 Stream流的一整系列了,其实我相信Stream流对很多使用Java的同 ...

  5. 跟我学 Java 8 新特性之 Stream 流(六)收集

    转载自   跟我学 Java 8 新特性之 Stream 流(六)收集 我们前面的五篇文章基本都是在说将一个集合转成一个流,然后对流进行操作,其实这种操作是最多的,但有时候我们也是需要从流中收集起一些 ...

  6. 跟我学 Java 8 新特性之 Stream 流(三)缩减操作

    转载自   跟我学 Java 8 新特性之 Stream 流(三)缩减操作 和前面两篇文章一起服用,效果会更佳.通过对流API的基础体验Demo和关键知识点的讲解,相信大家对流API都有一定的认识了, ...

  7. 跟我学 Java 8 新特性之 Stream 流(四)并行流

    转载自   跟我学 Java 8 新特性之 Stream 流(四)并行流 随着对流API认识的慢慢深入,本章我们要讨论的知识点是流API里面的并行流了. 在开始讨论并行流之前,我先引发一下大家的思考, ...

  8. 跟我学 Java 8 新特性之 Stream 流(五)映射

    转载自   跟我学 Java 8 新特性之 Stream 流(五)映射 经过了前面四篇文章的学习,相信大家对Stream流已经是相当的熟悉了,同时也掌握了一些高级功能了,如果你之前有阅读过集合框架的基 ...

  9. 使用Java8新特性(stream流、Lambda表达式)实现多个List 的笛卡尔乘积 返回需要的List<JavaBean>

    需求分析: 有两个Long类型的集合 : List<Long> tagsIds; List<Long> attributesIds; 现在需要将这两个Long类型的集合进行组合 ...

最新文章

  1. 手把手教线性回归分析(附R语言实例)
  2. 你应该掌握的七种回归技术
  3. 《毅力-如何培养自律的习惯》读后感
  4. kafka依赖zookeeper原因解析及应用场景
  5. 王长松:传统文化与中医养生(东南大学)汇总
  6. [css] 要是position跟display、overflow、float这些特性相互叠加后会怎么样?
  7. aop注解配置切点 spring_Spring通过自定义注解灵活配置AOP切点
  8. Navicat连接mysql8.0.1版本出现1251--Client
  9. 为解决半导体供应短缺问题,全球半导体厂商迅速增产
  10. C++模板中关键字typename与class的区别
  11. 光通量发光强度照度亮度关系_照度、强光、光通量之间是什么关系
  12. 自制电吉他效果器 DIY PCB(三)原理图与封装 上
  13. 红外接收管硬件电路曲折的调试过程,错误的使用过程记录
  14. hive sql 行列转换
  15. Ontrack易恢复最新版EasyRecovery数据恢复软件功能
  16. ROS2节点通信实现零拷贝
  17. TweenMax学习笔记整理
  18. 手把手推导APM的 sqrt_controller控制器
  19. 小菜鸟学浏览器之感悟
  20. 哪款蓝牙耳机跑步好用?跑步好用的耳机推荐

热门文章

  1. [mybatis]Getting Started
  2. [PAT乙级]1032 挖掘机技术哪家强
  3. C++实现井字棋小游戏(写得不好,留作纪念!!!)
  4. 高等数学上-赵立军-北京大学出版社-题解-练习5.3
  5. How many ways HDU - 1978(记忆化搜索关于求多少种方式模板)
  6. 【BZOJ3512】DZY Loves Math IV(杜教筛)
  7. H - Maximal submatrix HDU - 6957
  8. 牛客题霸 [扑克牌顺子] C++题解/答案
  9. 数列互质(莫队算法)
  10. 2020牛客国庆集训派对day2 AKU NEGARAKU