try-with-resources(TWR)方式关闭流资源

使用传统的方式关闭流资源当然没问题,但是需要写的代码有点多,而try-with-resources是Java 7 之后的新语法糖,旨在减轻开发人员释放try块中使用的资源的压力。一时用TWR方式一时爽,一直用一直爽,但是有些情况也是不能使用这种方式的,但是绝大多数时候是可以使用的,下面进行详细的介绍。

传统方式关闭资源

这里以拷贝一个文件为例,我们最后需要关闭文件输入流和文件输出流。使用传统方式关闭如下:

@Test
    public void copyFileWithClassics(){
        /**
         * 1、创建输入输出流
         * 2、拷贝文件
         * 3、关闭输入输出流
         */
        String src = "src/strategy/demo/TWRDemo.java";
        String dest = "src/strategy/demo/TWRDemo.java.bak";
        // 1、创建输入输出流
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            fileInputStream = new FileInputStream(src);
            fileOutputStream = new FileOutputStream(dest);

            // 2、拷贝文件
            int content;
            while ((content = fileInputStream.read()) != -1){
                fileOutputStream.write(content);
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            // 3、关闭输入输出流,遵循先打开后关闭原则
            try{
                if (fileOutputStream != null){
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            try {
                if (fileInputStream != null){
                    fileInputStream.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

可以看见,关闭输入输出流的时候需要判空和捕获IO异常,这样写当然没啥大问题,但是代码量是非常多的。那么在JDK7之后,可以使用TWR方式来关闭资源,如下。

Try-With-Resources 方式关闭资源

try-with-resourcesJava 中用于自动资源管理的语句。它被设计用于在不再需要时自动关闭文件、套接字或数据库连接等资源,并通过减少样板代码来简化资源管理。具体做法就是将需要自动关闭资源的对象定义在try后面的小括号中,注意:需要在小括号中声明!

@Test
    public void copyFileWithTWR(){
        /**
         * 1、创建输入输出流
         * 2、拷贝文件
         * 3、自动关闭输入输出流
         */
        String src = "src/strategy/demo/TWRDemo.java";
        String dest = "src/strategy/demo/TWRDemo.java.bak";

        // 1、创建输入输出流
        try (
                // 3、自动关闭输入输出流
                FileInputStream fileInputStream = new FileInputStream(src);
                FileOutputStream fileOutputStream = new FileOutputStream(dest);
        ){
            // 2、拷贝文件
            int content;
            while ((content = fileInputStream.read()) != -1){
                fileOutputStream.write(content);
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

大多数JDK提供的流资源都可以使用TWR方式自动关闭,但是有些情况下不能使用,下面这几种情况请注意不能使用TWR方式:

  • 不是 AutoCloseable 或 Closeable 接口的资源: try-with-resources 只能用于实现了 AutoCloseable 或 Closeable 接口的对象。如果一个资源没有实现这两个接口中的任何一个,就无法使用 try-with-resources。
// 如果 MyResource 没有实现 AutoCloseable 或 Closeable,将无法编译通过
try (MyResource resource = new MyResource()) {
    // 使用资源的代码
} catch (Exception e) {
    // 处理异常
}
  • 在 try-with-resources 语句之外声明的资源: 在 try-with-resources 中使用的资源必须是 effectively final 或 final。如果尝试在 try-with-resources 块内为资源赋予新值,将无法编译。
// 由于 `resource` 不是 effectively final,所以这段代码将无法编译
MyResource resource = new MyResource();
try (resource) {
    // 使用资源的代码
} catch (Exception e) {
    // 处理异常
}

因此,在不确定是否会自动关闭资源的时候,请鼠标选中需要关闭的资源类名,然后快捷键 ctrl+H 快速查看继承关系,例如查看FileInputStream如下:
在这里插入图片描述
可以看见最底层的实现接口是 AutoCloseable,因此可以使用TWR方式关闭该资源!

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

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

相关文章

HTTP 到 HTTPS 再到 HSTS 的转变

近些年,随着域名劫持、信息泄漏等网络安全事件的频繁发生,网站安全也变得越来越重要,也促成了网络传输协议从 HTTP 到 HTTPS 再到 HSTS 的转变。 HTTP HTTP(超文本传输协议) 是一种用于分布式、协作式和超媒体信息系…

如何零基础自学AI人工智能

随着人工智能(AI)的快速发展,越来越多的有志之士被其强大的潜力所吸引,希望投身其中。然而,对于许多零基础的人来说,如何入门AI成了一个难题。本文将为你提供一份详尽的自学AI人工智能的攻略,帮…

Git企业开发级讲解(五)

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、bug 分⽀二、删除临时分支三、小结 一、bug 分⽀ 假如我们现在正在 dev2 分⽀上进⾏开发…

【数据结构与算法】线性表 - 顺序表

目录 1. 线性表2.顺序表3.顺序表的优缺点4.实现(C语言)4.1 头文件 seqList.h4.2 实现 seqList.c 1. 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见…

gRPC 的原理 介绍带你从头了解gRPC

gRPC 的原理 什么是gRPC gRPC的官方介绍是:gRPC是一个现代的、高性能、开源的和语言无关的通用 RPC 框架,基于 HTTP2 协议设计,序列化使用PB(Protocol Buffer),PB 是一种语言无关的高性能序列化框架,基于 HTTP2PB 保…

Qt布局技巧

可以先把控件放置了,再选中所有控件右键布局 或者是点击上面的:

cesium雷达效果(脉冲圆)

cesium雷达效果(脉冲圆) 下面富有源码 实现思路 使用ellipse方法加载圆型,修改ellipse中‘material’方法重写glsl来实现当前效果 示例代码 index.html <!DOCTYPE html> <html lang="en"><head>

CronExpression

CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年]序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , - * / 2 分 是 0-59 , - * / 3 小时 是 0-23 , - * / 4 日 是 1-31 , - * ? / L W 5 月 是 1-12 or JA…

Matlab群体智能优化算法之海象优化算法(WO)

文章目录 一、灵感来源二、算法的初始化三、GTO的数学模型Phase1&#xff1a;危险信号和安全信号Phase2&#xff1a;迁移&#xff08;探索&#xff09;Phase3&#xff1a;繁殖&#xff08;开发&#xff09; 四、流程图五、伪代码六、算法复杂度七、WO搜索示意图八、实验分析和结…

jbase打印导出实现

上一篇实现了虚拟M层&#xff0c;这篇基于虚拟M实现打印导出。 首先对接打印层 using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Xml;namesp…

探索NLP中的核心架构:编码器与解码器的区别

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

高校教师资格证备考

高等教育制度 关于人的全面发展和个体发展的关系&#xff0c;说法正确的是&#xff08;ABC&#xff09;。 A.个体发展是在全面发展基础上的选择性发展 B.全面发展是个体发展的前提和基础 C.个体发展又是全面发展的动力 D.个体发展是全面发展的前提和基础

什么是缓存雪崩、击穿、穿透?

背景 数据一般是存储于数据库中&#xff0c;数据库中的数据都是存在磁盘上的&#xff0c;磁盘读写的速度相较于内存或者CPU中的寄存器来说是非常慢的了。 如果用户的请求都直接访问数据库的话&#xff0c;请求数量一上来&#xff0c;数据库很容易就崩溃了&#xff0c;所以为了…

html网页设计 01基础标签

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body> <!-- 标题标签 h1最大 --><h1>最大标签</h1><h2>二级标签</h2><h3>三级标签</h3><…

SpringBoot 统一功能处理

一、用户登录拦截器 1、拦截器实现步骤 步骤1&#xff1a;自定义拦截器 // 自定义拦截器 Component public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object h…

信号的机制——信号的发送与处理

对于硬件触发的&#xff0c;无论是中断&#xff0c;还是信号&#xff0c;肯定是先到内核的&#xff0c;然后内核对于中断和信号处理方式不同。一个是完全在内核里面处理完毕&#xff0c;一个是将信号放在对应的进程 task_struct 里信号相关的数据结构里面&#xff0c;然后等待进…

紫色调城市和奔跑人物剪影背景工会工作总结汇报PPT模板

这是一套紫色调城市和奔跑人物剪影背景工会工作总结汇报PPT模板&#xff0c;共33页&#xff1b; PPT模板封面&#xff0c;使用了蓝天白云、城市剪影、奔跑人物剪影背景图片。中间填写工会工作总结汇报PPT标题。界面色彩丰富充满活力。 PowerPoint模板内容页&#xff0c;由31张…

gittee启动器

前言 很多小伙伴反馈不是使用gitee&#xff0c;不会寻找好的项目&#xff0c;在拿到一个项目不知道从哪里入手。 鼠鼠我呀就是宠粉&#xff0c;中嘞&#xff0c;老乡。整&#xff01;&#xff01;&#xff01; git的基本指令 在使用gitee的时候呢&#xff0c;我们只需要记住…

C++加持让python程序插上翅膀——利用pybind11进行c++和python联合编程示例

目录 0、前言1、安装 pybind11库c侧python侧 2、C引入bybind11vs增加相关依赖及设置cpp中添加头文件及导出模块cpp中添加numpy相关数据结构的接收和返回编译生成dll后改成导出模块同名文件的.pyd 3、python调用c4、C引入bybind11 0、前言 在当今的计算机视觉和机器学习领域&am…

【入门篇】1.4 redis 客户端 之 Lettuce 详解

文章目录 1. 简介1. 什么是Lettuce2. Lettuce与其他Redis客户端的比较3. Lettuce的特性和优势 2. 安装和配置3. 连接池配置1. 什么是连接池2. Lettuce的连接池使用与配置3. 连接池配置项 4. 基本操作1. 如何创建Lettuce连接2. Lettuce的基本操作如增删改查3. Lettuce的事务操作…