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