try-with-resource如何优雅的关闭io流[通俗易懂]

try-with-resource如何优雅的关闭io流[通俗易懂]JAVA的一大特性就是JVM会对内部资源实现自动回收,即自动GC,给开发者带来了极大的便利。但是JVM对外部资源的引用却无法自动回收,例如数据库连接,网络连接以及输入输出IO流等,这些连接就需要我们手动去关闭,不然会导致外部资源泄露,连接池溢出以及文件被异常占用等。传统的手动释放外部资源一般放在一般放在try{}catch(){}finally{}机制的finally代码块中,因为finally代码块中语句是肯定会被执行的,即保证了外部资源最后一定会被释放。同时考虑到finally代码块中也有可能出现异

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

JAVA的一大特性就是JVM会对内部资源实现自动回收,即自动GC,给开发者带来了极大的便利。但是JVM对外部资源的引用却无法自动回收,例如数据库连接,网络连接以及输入输出IO流等,这些连接就需要我们手动去关闭,不然会导致外部资源泄露,连接池溢出以及文件被异常占用等。

传统的手动释放外部资源一般放在一般放在try{}catch(){}finally{}机制的finally代码块中,因为finally代码块中语句是肯定会被执行的,即保证了外部资源最后一定会被释放。同时考虑到finally代码块中也有可能出现异常,finally代码块中也有一个try{}catch(){},这种写法是经典的传统释放外部资源方法,显然是非常繁琐的。

传统写法操作io流

例如如下读取的文件的io流,我们之前可能会这样写

public class Main {
    public static void main(String[] args) {
        FileInputStream fileInputStream =null;
        try {
            fileInputStream = new FileInputStream(new File("/Users/laoniu/a.txt")); //打开流
            byte[] bytes = new byte[1024];
            int line = 0;    
            //读取数据
            while ((line = fileInputStream.read(bytes))!= -1){
                System.out.println(new String(bytes,0,line));
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fileInputStream != null){ //不为空
                try {
                    fileInputStream.close(); //关闭流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

使用try-with-resource写法优雅操作io流

public class Main {
    public static void main(String[] args) {
        //把打开流的操作都放入try()块里
        try( FileInputStream fileInputStream = new FileInputStream(new File("/Users/laoniu/a.txt"))) {
            byte[] bytes = new byte[1024];
            int line = 0;
            while ((line = fileInputStream.read(bytes))!= -1){
                System.out.println(new String(bytes,0,line));
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在try()中可以编写多个文件io流或网络io流。让我们看看java编译器是怎么帮我们实现的

借助idea查看编译后的代码

try-with-resource如何优雅的关闭io流[通俗易懂]

可以看到编译后的代码,java编译器自动替我们加上了关闭流的操作。所以跟我们自己关闭流是一样的。try-with-resource这样优雅的写法还是不错的,让代码看起来不那么臃肿。

注意jdk1.7以后才可以用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184253.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • (2)JMeter元件详解之Simple Controller简单控制器

    (2)JMeter元件详解之Simple Controller简单控制器

    2021年7月13日
    119
  • 微信十年庆生 米聊黯然退场

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 【环球网科技综合报道】在微信庆祝 “十周岁”生日的当天,小米旗下米聊宣布彻底退出历史舞台,并关闭了服务器。 2021…

    2021年6月25日
    78
  • JavaWeb开发与代码的编写(一)[通俗易懂]

    JavaWeb开发与代码的编写(一)[通俗易懂]JavaWeb开发与代码的编写(一)绝对路径与相对路径在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下:一、使用${pageContext.request.contextPath}  代码”${pageContext.request.contextPath}”的作用是取出部署的应用…

    2022年7月8日
    18
  • MyEclipse中安装SVN插件[通俗易懂]

    MyEclipse中安装SVN插件[通俗易懂]一、SVN插件的安装步骤1、打开MyEclipse软件,选择顶部的菜单栏中的“Help”—->“Installfromsite…”,出现以下弹窗2、点击右上角的“Add…”,填写SVN仓库信息,然后点击“OK”在Name后面填写“svn”在Location后输入“http://subclipse.tigris.org/update_1.10.x”…

    2022年7月20日
    11
  • vb.net listview_不VB思考VB数据表

    vb.net listview_不VB思考VB数据表控件:TEXTBOX   :1个     Name:txtJobNoBUTTON:    2个      Name:btnFilter,btnShowAllLISTVIEW: 1个      Name:lstvwJobNo Columns:JobNo,ContainerID,CartonID,PO,Style,Color,Size,ShipMent,Factory        

    2022年9月1日
    1
  • 关系数据模型表示采用_数据库常见的数据模型

    关系数据模型表示采用_数据库常见的数据模型关系模型是目前最常用地数据模型之一。关系型数据库系统采用关系模型作为数据的组织方式,在关系模型中用表格结构表达实体集,以及实体集之间的联系,其最大特点是描述的一致性。关系模型是由若干个关系模式组成的集合。关系模式可记为R(A1,A2,A3,…,An),其中,R表示关系名,A1,A2,A3,…,An表示属性名。一个关系模式相当于一个记录型,对应与程序设计语言中类型定义的概念。关系是一个实例,也是一张…

    2022年10月30日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号