02-JDK新特性-try-with-resources自动管理资源关闭

本文介绍了Java7引入的try-with-resources特性,用于简化资源管理,自动关闭实现了AutoCloseable或Closeable接口的资源,避免了资源泄露问题。它提高了代码的可读性和可维护性,与try-catch-finally相比,减少了代码量和异常处理的复杂性。
摘要由CSDN通过智能技术生成

try-with-resources

为什么要介绍这个了

看看一下以下代码:

public static void fileCopyByTryWithResources(File src, File des) throws IOException {
    try (FileInputStream fis = new FileInputStream(src); FileOutputStream fos = new FileOutputStream(des);) {
        byte[] buffer = new byte[1024];
        int len = -1;
        while ((len = fis.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }
    }
}

在不了解try-with-resources的情况下,有没有人会认为资源没有进行关闭了?那么看看原来try-cache-finally复制文件的写法是怎样的

try-cache-finally复制文件写法

package demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopyUtils {

    /**
     * try-cache-finally复制文件写法
     *
     * @param src
     * @param des
     * @return void
     * @author Anna.
     * @date 2024/4/5 18:34
     */
    public static void fileCopy(File src, File des) throws IOException {
        FileInputStream fis = null;
        FileOutputStream fos = null;

        try {
            fis = new FileInputStream(src);
            fos = new FileOutputStream(des);
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

try-with-resources复制文件写法

package demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopyUtils {
    /**
     * try-with-resources复制文件写法
     *
     * @param src
     * @param des
     * @return void
     * @author Anna.
     * @date 2024/4/5 18:35
     */
    public static void fileCopyByTryWithResources(File src, File des) throws IOException {
        try (FileInputStream fis = new FileInputStream(src); FileOutputStream fos = new FileOutputStream(des);) {
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
        }
    }
}

所以什么是try-with-resources

try-with-resources是Java 7引入的一个新特性,它提供了一种简化资源管理的机制。

该特性主要用于自动关闭实现了AutoCloseable或Closeable接口的资源,如文件流、数据库连接等,从而避免了资源泄漏的问题。

在try-with-resources语句中,你可以声明一个或多个资源,这些资源在try代码块执行完毕后会被自动关闭。

这是通过Java虚拟机的异常处理机制和字节码的异常表来实现的,通过自动调用资源的close()方法来确保资源被正确地关闭。

使用方式:资源被声明在try关键字后面的圆括号中,多个资源之间用分号分隔。当try块执行完毕后,无论是否发生异常,这些资源都会被自动关闭。

在这里插入图片描述

应用好处:

  • 自动关闭资源:try-with-resources语句会在退出作用域时自动关闭打开的资源,包括打开的文件、网络连接等。这可以避免因忘记关闭资源而造成的内存泄露等问题。
  • 减少代码量:传统的try-catch-finally块需要额外的代码来确保资源被正确关闭。而在try-with-resources中,资源可以直接嵌入到try语句中,减少了代码量,提高了代码的可读性和可维护性。
  • 更好的代码可读性:使用try-with-resources,开发者不再需要编写繁琐的finally块来关闭资源,代码更加清晰易懂。同时,在出现异常时,异常信息也更加明确,有助于减少调试时间。
  • 处理多个资源:在try-with-resources中,你可以同时声明并初始化多个资源,使得处理多个资源关闭操作变得更加简洁和清晰。

与try{}的区别:

  • 异常处理与资源管理:基本的try{}块主要用于捕获和处理异常,而try-with-resources不仅可以捕获异常,还能自动管理资源,确保资源在使用后被正确关闭。
  • 结构差异:try{}通常与catch和finally块结合使用,其中finally块用于执行清理操作,包括关闭资源。而try-with-resources将资源声明在try语句的括号中,并自动处理资源的关闭,无需显式编写finally块。
  • 使用限制:try-with-resources要求资源必须实现AutoCloseable或Closeable接口。这意味着不是所有的对象都可以使用try-with-resources进行自动资源管理。而基本的try{}块则没有这样的限制,可以用于任何需要异常处理的代码。
  • 代码简洁性:由于try-with-resources能够自动处理资源关闭,使得代码更加简洁和易读。相比之下,使用传统的try-catch-finally结构处理资源关闭可能会使代码变得繁琐和难以维护。

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丨Anna丨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值