还在使用try-catch-finally么,过时了!

还在使用try-catch-finally么,过时了!

在Effective Java一书中有这么一条,try-with-resource优先于try—finally。那么try-with-resource到底是什么东西呢?

Java类库中存在许多必须用close方法来手动关闭的资源(InputStream、OutputStream等),以往我们常常认为try—finally是关闭这些资源的最佳方法,但是如果我们需要关闭的资源变多了,你的代码似乎看起来就没有那么整洁了。

下面举个小例子:

    public void finaly(String path){
        System.out.println("start");
        BufferedInputStream bin = null;
        BufferedOutputStream bout = null;
        try {
            bin = new BufferedInputStream(new FileInputStream(new File(path)));
            bout = new BufferedOutputStream(new FileOutputStream(new File(path)));
            int b;
            while ((b = bin.read()) != -1) {
                bout.write(b);
            }
        }catch (FileNotFoundException e) {
            e.getMessage();
        } catch (IOException e){
            e.getMessage();
        } finally {
            try{
                bin.close(); //关闭bin流,但有可能抛出异常
            }catch (IOException e){
                e.getMessage();
            }finally {
                try {
                    bout.close(); // 关闭bout流
                } catch (IOException e) {
                    e.getMessage();
                }
            }
        }
        System.out.println("end");
    }

还好在Java7给我们提供了对于这类问题的一个更好的解决方案:

   public void resource(String path){
        System.out.println("start");
        File f = new File(path);
        try(
            BufferedInputStream bin = new BufferedInputStream(new FileInputStream(f));
            BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(f))
        ){
            int b;
            while ((b = bin.read()) != -1) {
                bout.write(b);
            }
        }catch (IOException e) {
            e.getMessage();
        }
        System.out.println("end");
    }

但是切记!!!在使用这个语法糖时,请确保被构造的资源(也就是try后边括号中的对象),已经实现了Closeable或者AutoCloseable接口(Java和许多第三方类库现在已经实现或者扩展了这个接口)。
PS:如果你自己编写了一个类,它必须被关闭,那你也应该让你写的这个类实现这个接口。

posted @ 2021-07-08 10:16  CodeSweet  阅读(57)  评论(0编辑  收藏  举报