最新公告
  • 欢迎您光临极客文库,登录获取更多编程学习资源及文章!立即加入我们
  • JDK9新特性实战:简化流关闭新姿势。

    做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的这一点变化还是非常有用的。
    本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
    极客文库 » JDK9新特性实战:简化流关闭新姿势。

    常见问题FAQ

    如果资源链接失效了怎么办?
    本站用户分享的所有资源都有自动备份机制,如果资源链接失效,请联系本站客服QQ:2580505920更新资源地址。
    如果用户分享的资源与描述不符怎么办?
    可以联系客服QQ:2580505920,如果要求合理可以安排退款或者退赞助积分。
    如何分享个人资源获取赞助积分或其他奖励?
    本站用户可以分享自己的资源,但是必须保证资源没有侵权行为。点击个人中心,根据操作填写并上传即可。资源所获收益完全归属上传者,每周可申请提现一次。
    如果您发现了本资源有侵权行为怎么办?
    及时联系客服QQ:2580505920,核实予以删除。

    参与讨论

    • 108会员总数(位)
    • 3700资源总数(个)
    • 5本周发布(个)
    • 2 今日发布(个)
    • 202稳定运行(天)

    欢迎加入「极客文库」,成为原创作者从这里开始!

    立即加入 了解更多
    成为赞助用户享有更多特权立即升级