java try-with-resource语句使用

定义

JDK7之后,Java多了个新的语法:try-with-resources语句,
可以理解为是一个声明一个或多个资源的 try语句(用分号隔开),
一个资源作为一个对象,并且这个资源必须要在执行完关闭的,
try-with-resources语句确保在语句执行完毕后,每个资源都被自动关闭 。
任何实现了** java.lang.AutoCloseable**的对象, 包括所有实现了 java.io.Closeable 的对象
, 都可以用作一个资源。

我们根据定义来自己实现一个玩玩:

public class MyAutoClosable implements AutoCloseable {
    public void doIt() {
        System.out.println("MyAutoClosable doing it!");
    }

    @Override
    public void close() throws Exception {
        System.out.println("MyAutoClosable closed!");
    }

    public static void main(String[] args) {
        try(MyAutoClosable myAutoClosable = new MyAutoClosable()){
            myAutoClosable.doIt();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
输出.png

发现close方法被自动执行了,这个的好处在于,我们又可以变懒了,不用再去关心连接调用完了是否关闭,文件读写完了是否关闭,专心的实现业务即可。

我们根据这个特性,来试下文件读写
先试试传统写法

public void readFile() throws FileNotFoundException {
        FileReader fr = null;
        BufferedReader br = null;
        try{
            fr = new FileReader("d:/input.txt");
            br = new BufferedReader(fr);
            String s = "";
            while((s = br.readLine()) != null){
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                br.close();
                fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

需要在最后finally中关闭读文件流。

我们再试试try with resource写法

public void readFile() throws FileNotFoundException {

        try(
                FileReader fr = new FileReader("d:/input.txt");
                BufferedReader br = new BufferedReader(fr)
        ){
            String s = "";
            while((s = br.readLine()) != null){
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

代码也整洁了一些

通过查看源码可以发现

  • public class FileReader extends InputStreamReader
  • public class InputStreamReader extends Reader
  • public abstract class Reader implements Readable, Closeable

  • public class BufferedReader extends Reader
  • public abstract class Reader implements Readable, Closeable

发现FileReader和BufferedReader最终都实现了Closeable接口,所以根据try with resource 定义,他们都是可以自动关闭的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,874评论 18 399
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,731评论 1 114
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,281评论 19 139
  • 在经过一次没有准备的面试后,发现自己虽然写了两年的android代码,基础知识却忘的差不多了。这是程序员的大忌,没...
    猿来如痴阅读 2,919评论 3 10
  • 我一直想尝试这样一种收费方式: 有全部功能、但交互复杂的版本,免费; 仅必要功能、但交互简洁的版本,收费。 听起来...
    ITJason阅读 217评论 7 1