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

栏目: Java · 发布时间: 6年前

内容简介:开发中,我们常常需要在最后进行一些资源的关闭。比如读写文件流等,常见的,我们会在最后的finally里进行资源的关闭。但是这种写法是很不简洁的。其实,早在JDK1.7就已经引入了try-with-resources来关闭资源的方式,我们今天就来体验一下try-with-resources的简洁之处。本文首发于头条号【Happyjava】。Happy的掘金地址:在旧版的写法中(其实现在还有很多程序员是这么写的),资源都放在finally块里进行关闭,如下:

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

原创声明

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

旧版关闭资源的一些例子

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

@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为空而导致的空指针异常。这种写法是很繁琐的。

try-with-resources

同样的功能,如果采用try-with-resources,就会使代码变得非常简洁:

@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的括号内,则会在编译器就报错。

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

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

自定义可以被自动关闭的类

我们也可以把自己的类编写为可以被try-with-resources自动关闭的类,只需要我们去实现java.lang.AutoCloseable接口即可。

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-catch-finally?来使用try-with-resources优雅地关闭流吧

总结

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

通灵芯片

通灵芯片

Daniel Hillis / 崔良沂 / 上海世纪出版集团 / 2009-1 / 19.80元

本书深入浅出地阐述了计算机科学中许多基本而重要的概念,包括布尔逻辑、有限自动机、编程语言、图灵机的普遍性、信息论、算法、并行计算、量子计算、神经网络、机器学习乃至自组织系统。 作者高屋建瓴式的概括,既不失深度,又妙趣横生,相信读者读后会有很多启发。 目录: 序言:石的奇迹 第一章 通用件 第二章 万能积木 第三章 程序设计 第四章 图灵机的普适性 第......一起来看看 《通灵芯片》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具