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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/600245.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql底层原理七:InnoDB 行记录

1.行格式 1.1 Compact行格式 1.1.1 示意图 1.1.2 准备一下 1)建表 mysql> CREATE TABLE record_format_demo (-> c1 VARCHAR(10),-> c2 VARCHAR(10) NOT NULL,-> c3 CHAR(10),-> c4 VARCHAR(10)-> ) CHARSETascii ROW_FORMATCOM…

GIS与数字孪生共舞,打造未来智慧场景

作为一名数字孪生资深用户,近日我深刻理解到GIS(地理信息系统)在构建数字孪生体中的关键作用。 数字孪生技术旨在构建现实世界的虚拟镜像,而GIS则是这一镜像中不可或缺的空间维度框架和导航灯塔。数字孪生的核心是通过数字化方式…

写一个宏,可以将一个整数二进制奇数位和偶数位交换详解

何为一个整数二进制奇数位和偶数位 想要完成解题,我们首先要知道一个整数二进制奇数位和偶数位,具体代表着哪一位 对于一个32位的整型,它的下标是从 0 ~ 31 的,总共32位。 其中下表为0的位是最右边的位(即最低有效位…

入门微调预训练Transformer模型

大家好,HuggingFace 为众多开源的自然语言处理(NLP)模型提供了强大的支持平台,让这些模型能够通过训练和微调来更好地服务于各种特定的应用场景。在大型语言模型(LLM)迅猛发展的今天,HuggingFac…

qt 打印日志

在 Qt Creator 中,将 QDebug、QInfo、QWarning、QCritical 和 QFatal 打印的日志输出到指定文件,需要设置 Qt 的消息处理机制。这通常涉及到安装一个自定义的消息处理器,该处理器将日志消息重定向到文件。以下是一个基本的步骤指南&#xff1…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-航班时间

#include<iostream> using namespace std;int getTime(){int h1, h2, m1, m2, s1, s2, d 0;//d一定初始化为0&#xff0c;以正确处理不跨天的情况 scanf("%d:%d:%d %d:%d:%d (%d)", &h1, &m1, &s1, &h2, &m2, &s2, &d);return d …

【JAVASE】带你了解面向对象三大特性之一(多态)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 1.多态 1.1 多态的概念 多态的概念&#xff1a;通俗来说&#…

MySQL的基本查询

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;MySQL &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容介绍了mysql的基本查询部分的知识&#xff0c;包括Crea…

WebAPI(一)之DOM操作元素属性和定时器

webAPI之DOM操作元素属性和定时器 介绍概念DOM 树DOM 节点document 获取DOM对象操作元素内容操作元素属性常用属性修改控制样式属性操作表单元素属性自定义属性 间歇函数今日单词 了解 DOM 的结构并掌握其基本的操作&#xff0c;体验 DOM 的在开发中的作用 知道 ECMAScript 与 …

大厂高频面试题复习JAVA学习笔记-JUC多线程及高并发(下)

目录 7 阻塞队列知道吗? 概念​编辑 synchronized和lock的区别 虚假唤醒情况 ​编辑​编辑 8 线程池用过吗?ThreadPoolExecutor谈谈你的理解? Callable接口 线程池 Executors工具类 线程池底层原理 线程池七大参数 七大参数 底层原理 9 线程池用过吗?生产上你如…

Cyber Weekly #1

赛博新闻 1、弱智吧竟成最佳中文AI训练数据&#xff1f;&#xff01;中科院等&#xff1a;8项测试第一&#xff0c;远超知乎豆瓣小红书 使用弱智吧数据训练的大模型&#xff0c;跑分超过百科、知乎、豆瓣、小红书等平台&#xff0c;甚至是研究团队精心挑选的数据集。弱智吧数…

基于单片机数码管20V电压表仿真设计

**单片机设计介绍&#xff0c;基于单片机数码管20V电压表仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机数码管20V电压表仿真设计的主要目的是通过单片机和数码管显示电路实现一个能够测量0到20V直流电压的电…