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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SecureCRT防止超时自动断开

Options——>Session Options——>Terminal——>选择 Send protocol NO-OP ——>60seconds(每一分钟发送一次请求)

【考研数学】《1800》《660》还是《880》?怎么刷效果最好?

刷题吃不透,做了再多也没用! 你目前连1800都没法拿下,你还着急要做660和880,是认真的吗? 这《接力题典1800》有啥特色呢?知识点全面覆盖,题目中规中矩,配合汤老师的视频看效果更佳…

【二分查找】Leetcode 二分查找

题目解析 二分查找在数组有序可以使用,也可以在数组无序的时候使用(只要数组中的一些规律适用于二分即可) 704. 二分查找 算法讲解 当left > right的时候,我们循环结束,但是当left和right缩成一个点的时候&#x…

【Java SE】继承与组合

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 再谈初始化2. 再谈protected关键字2.1 子类可见性2.2 访问修饰限定符的选择 3. 继承与组合 1. 再谈初始化…

Python实现获取某手视频评论【自动生成did】

今天在获取某手视频评论的时候,总是会出发风控导致web_did失效,就算登录了也没用,还会导致账号被风控,app端抓包和逆向难度又大,那么有没有一种不需要登录而且不会出发风控的方法来获取评论列表呢?当然有&a…

Python球球大作战

文章目录 写在前面球球大作战程序设计注意事项写在后面 写在前面 安装pygame的命令: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pygame球球大作战 《球球大作战》是一款简单易上手、充满趣味性和竞技性的休闲手游。游戏的核心玩法可以用一句话概…

机器学习 | 基于Scikit-learn中手写数字集的交叉验证

在本文中,我们将讨论交叉验证及其在手写数字集上的使用。此外,我们将看到使用手写数字集的代码实现。 什么是交叉验证? 手写数字集的交叉验证将允许我们选择最佳参数,避免过度拟合训练数据集。它是一个试验的尝试程序&#xff0…

【Python】Tkinter模块(巨详细)

专栏文章索引:Python 有问题可私聊:QQ:3375119339 目录 一、窗口设计 1.创建窗口 2.窗口属性 3.窗口位置 4.Widget 一、窗口设计 1.创建窗口 实例-创建空白窗口: from tkinter import * # 导入tkinter模块win Tk() # 通…

算法(二分查找)

我们有三种方式可以使用二分查找 1.朴素的二分查找,这种方式可能存在局限性 2.查找左边界的二分查找 3.查找右边界的二分查找 1.二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums…

JVM调优参数介绍

堆配置 -Xms:初始堆大小 -Xms:最大堆大小 -XX:NewSizen:设置年轻代大小 -XX:NewRation:设置年轻代和年老代的比值。如:为3表示年轻代和年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 -XX:SurvivorRation:年轻代中Eden区与…

英语学习笔记-元音

元音 什么是元音呢?简单来说就是,在发音时,气流非常通畅,没有阻碍,想发多大声都可以。 元音分为: 单元音双元音 总共有20个元音 如何发音 根据上图,发音可以分为两类: 黑色部分…

链式二叉树经典OJ题目(二)

目录 结构体及头文件: 1.二叉树的前序遍历 题目描述: 思路分析: 源码: 2.二叉树的翻转 题目描述: 思路分析: 源码: 3.另一颗子树 题目描述: 思路分析: 源码&…

00-JAVA基础-动态编译

动态编译 JAVA 6 引入了动态编译机制。Java 动态编译是指在运行时将Java源代码编译成可执行的字节码。这通常使用Java的内置编译器API javax.tools.JavaCompiler 来实现。 动态编译的应用场景 可以做一个浏览器编写java代码,上传服务器编译和运行的在线测评系统服…

我为什么会选择Vim来开发Go项目及Vim IDE安装配置和操作

你好,我是孔令飞,字节跳动云原生资深研发、前腾讯云原生技术专家。《企业级 Go 项目开发实战》、《从零开发企业级 Go 应用》作者,欢迎加入 孔令飞的云原生实战营,助你进阶 Go 云原生高级开发工程师。 作为一名 Golang 开发&…

我的需求分析方法论

或网上看了无数博客文章、技术视频,或购买金装版本技术书籍,看过无数原理原则、各种各样经典方法论,真正在实际开发工作中,本能去遵守和执行的又留下多少呢。 启动一个新系统时,我们可能还会去花些时间遵循这些原理原则…

前端学习之DOM编程-docmument对象、操作DOM对像内容、操作DOM对象属性方式、操作DOM对象的样式

docmument对象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>document对象</title> </head> <body><div id"container" nameparent><ul name"parent&qu…

k8s CNI Calico 网络模式总结

目录 calico架构图 IPIP模式下的架构图 calico 核心组件 Overlay 网络模式&#xff1a; Pod IP对外暴露 不对外暴露&#xff1a; 实现对外暴露的方法&#xff1a; overlay模式下的网络MTU Iptables & ipvs overlay的主要缺点&#xff1a; Full-mesh Unoverla…

DXP学习003-PCB编辑器的环境参数及电路板参数相关设置

目录 一&#xff0c;dxp的pcb编辑器环境 1&#xff0c;创建新的PCB设计文档 2&#xff0c;PCB编辑器界面 1&#xff09;布线工具栏 2&#xff09;公用工具栏 3&#xff09;层标签栏 ​☀ 3&#xff0c;PCB设计面板 1&#xff09;打开pcb设计面板 4&#xff0c;PCB观察…

重温OKHTTP源码

本文基于OkHttp4.12.0源码分析 官方地址 概括 本篇主要是对okhttp开源库的一个详细解析&#xff0c;包含详细的请求流程分析、各大拦截器的解读等。 使用方法 同步请求&#xff1a;创建一个OKHttpClient对象&#xff0c;一个Request对象&#xff0c;然后利用它们创建一个Ca…

免费微信小程序源码分享~搭起来改一下就可以【创业】

【前言】现在很多人都想做微信小程序创业搞钱&#xff0c;但是苦于不会开发或过高的开发成本只能放弃&#xff0c;下面我收集了几套微信小程序的源码供各位有梦想的同学免费使用~ 这些小程序代码都包含了客户端和管理端&#xff0c;你搭建起来就可以开始创业搞钱了~ 下载链接&a…