• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

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

技术杂谈 勤劳的小蚂蚁 3个月前 (01-29) 60次浏览 已收录 0个评论 扫描二维码

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

JDK6

在JDK6及之前,每个资源都需要我们手动写代码关闭,如:
  1. FileInputStream fis =null;
  2. byte[] buffer =newbyte[1024];
  3. try{
  4.    fis =newFileInputStream(newFile("E:\Java技术栈.txt"));
  5.    while(fis.read(buffer)>0){
  6.        System.out.println(newString(buffer));
  7.    }
  8. }catch(Exception e){
  9.    e.printStackTrace();
  10. }finally{
  11.    if(fis !=null){
  12.        try{
  13.            fis.close();
  14.        }catch(IOException e){
  15.            e.printStackTrace();
  16.        }
  17.    }
  18. }
资源打开使用完后,必须在finally块中进行手动关闭!我们有的同事,做一个查询功能点,打开了连接查询完后没有手动关闭,最后造成连接池超出最大连接数而使系统功能堵塞。

JDK7

JDK7发布后,添加了新特性:try-with-resources语句。所有需要关闭的资源只要实现了 java.lang.AutoCloseable(java.io.Closeable就实现了这个接口)接口就在会程序结束后自动关闭。
如上面的读取文件的流程序用JDK7来写:
  1. byte[] buffer =newbyte[1024];
  2. try(FileInputStream fis =newFileInputStream(newFile("E:\Java技术栈.txt"))){
  3.    while(fis.read(buffer)>0){
  4.        System.out.println(newString(buffer));
  5.    }
  6. }catch(Exception e){
  7.    e.printStackTrace();
  8. }
所有的资源在 try()里面定义,并去掉了finally模块。
下面我们来写一个自定义的流来看看是否自动关闭了。
定义一个自定义输入输出流
  1. classMyInputStreamimplementsAutoCloseable{
  2.    void read(String content){
  3.        System.out.println("read content "+ content);
  4.    }
  5.    @Override
  6.    publicvoid close()throwsException{
  7.        System.out.println("input stream is closed.");
  8.    }
  9. }
  10. classMyOutputStreamimplementsAutoCloseable{
  11.    void write(String content){
  12.        System.out.println("write content "+ content);
  13.    }
  14.    @Override
  15.    publicvoid close()throwsException{
  16.        System.out.println("out stream is closed.");
  17.    }
  18. }
单个资源自动关闭
  1. try(MyInputStream mis =newMyInputStream()){
  2.    mis.read("7_2");
  3. }catch(Exception e){
  4.    e.printStackTrace();
  5. }
输出:
read content 7_2
input stream is closed.
多个资源自动关闭
try()里面可以定义多个资源,它们的关闭顺序是最后在 try()定义的资源先关闭。
  1. try(MyInputStream mis =newMyInputStream();MyOutputStream mos =newMyOutputStream()){
  2.    mis.read("7_3");
  3.    mos.write("7_3");
  4. }catch(Exception e){
  5.    e.printStackTrace();
  6. }
输出:
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修饰的,不然会编译错误。
  1. MyInputStream mis =newMyInputStream();
  2. MyOutputStream mos =newMyOutputStream();
  3. try(mis; mos){
  4.    mis.read("1.9");
  5.    mos.write("1.9");
  6. }catch(Exception e){
  7.    e.printStackTrace();
  8. }
输出:
read content 1.9
write content 1.9
out stream is closed.
input stream is closed.
再来看个例子:
  1. Connection dbCon =DriverManager.getConnection("url","user","password");
  2. try(dbCon;ResultSet rs = dbCon.createStatement().executeQuery("select * from emp")){
  3.    while(rs.next()){
  4.        System.out.println("In loadDataFromDB() =====>>>>>>>>>>>> "+ rs.getString(1));
  5.    }
  6. }catch(SQLException e){
  7.    System.out.println("Exception occurs while reading the data from DB ->"+ e.getMessage());
  8. }
dbCon和rs都能被自动关闭。
JKD9虽然简化了,但感觉还是没有什么质的变化,实际用途我们可能不希望关心资源的关闭,或者在方法结束之后如果是局部变量它就能自动关闭。或许是我站的高度不够,官方有其他的考量,但JDK9的这一点变化还是非常有用的。

丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:JDK9新特性实战:简化流关闭新姿势。
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00