你是否还在写try-catch-finally?来使用try-with-resources优雅地关闭流吧

前言

开发中,咱们经常须要在最后进行一些资源的关闭。好比读写文件流等,常见的,咱们会在最后的finally里进行资源的关闭。可是这种写法是很不简洁的。其实,早在JDK1.7就已经引入了try-with-resources来关闭资源的方式,咱们今天就来体验一下try-with-resources的简洁之处。java

原创声明

本文首发于头条号【Happyjava】。Happy的掘金地址:juejin.im/user/5cc289…,Happy的我的博客:(blog.happyjava.cn)[blog.happyjava.cn]。欢迎转载,但须保留此段声明。程序员

旧版关闭资源的一些例子

在旧版的写法中(其实如今还有不少程序员是这么写的),资源都放在finally块里进行关闭,以下:app

@Test
public void test4() {
    InputStream inputStream = null;
    try {
        inputStream = new FileInputStream("D:\\head.jpg");
        // do something
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
复制代码

这种写法的麻烦之处在于,咱们须要在finally块中关闭资源,因此inputStream只能定义在try块的外面。关闭以前,还须要作一步判空,避免由于inputStream为空而致使的空指针异常。这种写法是很繁琐的。ide

try-with-resources

一样的功能,若是采用try-with-resources,就会使代码变得很是简洁:spa

@Test
public void test5() {
    try (InputStream inputStream = new FileInputStream("D:\\head.jpg")) {
        byte[] bytes = inputStream.readAllBytes();
        // do something
    } catch (IOException e) {
        e.printStackTrace();
    }
}
复制代码

try-with-resources的用法就是,在try关键字的后面跟一个括号,把须要关闭的资源定义在括号内。在try块执行完以后会自动的释放掉资源。指针

什么资源能够被try-with-resources自动关闭

并非全部资源均可以被try-with-resources自动关闭的,只有实现了java.lang.AutoCloseable接口的类,才能够被自动关闭。若是没有实现java.lang.AutoCloseable的类定义在try的括号内,则会在编译器就报错。code

如,自定义一个类MyResource,定义在括号内则会报错:提示须要java.lang.AutoCloseable的类。cdn

自定义能够被自动关闭的类

咱们也能够把本身的类编写为能够被try-with-resources自动关闭的类,只须要咱们去实现java.lang.AutoCloseable接口便可。blog

class MyResource implements java.lang.AutoCloseable {

    @Override
    public void close() {
        System.out.println("调用了close方法");
    }
}
复制代码
@Test
public void test5() {
    try (InputStream inputStream = new FileInputStream("D:\\head.jpg");
         MyResource myResource = new MyResource()) {
        byte[] bytes = inputStream.readAllBytes();
        // do something
    } catch (IOException e) {
        e.printStackTrace();
    }
}
复制代码

执行以后,会输出“调用了close方法”接口

总结

try-with-resources能够使代码更加简洁并且不容易出错。相比传统的try-catch-finally的写法,显然try-with-resources优势更多,至少不会存在finally关闭资源由于没判空而致使空指针的问题。

相关文章
相关标签/搜索