try-with-resource优雅关闭资源

try-with-resource优雅关闭资源

一、介绍

1、java7引入的新特性
2、优雅关闭资源
3、一种Java语法糖

二、使用

在JDK7之前的时候,关闭流资源需要在finally块中手动关闭。
在JDK7引入了一个新特性try-with-resource,我们只需要在try()的括号里声明使用的流资源,而不需要自己在finally中关闭资源。

@Test
public void testCloseResource() {

    String originalUrl = "D:\\WorkSpace\\old.txt";
    String targetUrl = "D:\\WorkSpace\\new.txt";

    try (
            FileInputStream fileInputStream = new FileInputStream(originalUrl);
            FileOutputStream fileOutputStream = new FileOutputStream(targetUrl);
    ) {
        byte[] bytes = new byte[1024];
        int len;
        while ((len = fileInputStream.read(bytes)) != -1) {
            fileOutputStream.write(bytes, 0, len);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

可以通过反编译查看反编译后的代码,可以发现已经实现了资源关闭。(反编译工具: JD-GUI、Jad 等,我这里直接使用IDEA查看的)

@Test
public void testCloseResource() {
        String originalUrl = "D:\\WorkSpace\\old.txt";
        String targetUrl = "D:\\WorkSpace\\new.txt";

        try {
            FileInputStream fileInputStream = new FileInputStream(originalUrl);
            Throwable var4 = null;

            try {
                FileOutputStream fileOutputStream = new FileOutputStream(targetUrl);
                Throwable var6 = null;

                try {
                    byte[] bytes = new byte[1024];

                    int len;
                    while((len = fileInputStream.read(bytes)) != -1) {
                        fileOutputStream.write(bytes, 0, len);
                    }
                } catch (Throwable var34) {
                    var6 = var34;
                    throw var34;
                } finally {
                    if (fileOutputStream != null) {
                        if (var6 != null) {
                            try {
                                fileOutputStream.close();
                            } catch (Throwable var33) {
                                var6.addSuppressed(var33);
                            }
                        } else {
                            fileOutputStream.close();
                        }
                    }

                }
            } catch (Throwable var36) {
                var4 = var36;
                throw var36;
            } finally {
                if (fileInputStream != null) {
                    if (var4 != null) {
                        try {
                            fileInputStream.close();
                        } catch (Throwable var32) {
                            var4.addSuppressed(var32);
                        }
                    } else {
                        fileInputStream.close();
                    }
                }

            }
        } catch (FileNotFoundException var38) {
            var38.printStackTrace();
        } catch (IOException var39) {
            var39.printStackTrace();
        }

    }    

三、注意点

1、只有实现了AutoCloseable接口,TWR才可以实现多资源自动关闭。
2、TWR避免异常屏蔽:将底层的异常追加到最外层的异常上。
3、ByteArrayInputStream等不需要检查关闭的资源对象。
4、使用Socket获取的InputStream和OutputStream对象不需要关闭(Socket关闭了,流就关闭了)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值