Java 自动资源管理(Auto Resource Management)详解

Java 自动资源管理(Auto Resource Management)详解

在Java编程中,资源的正确管理是开发过程中一个非常重要的环节。如果资源(如文件、数据库连接、网络连接等)未被正确释放,可能会导致资源泄漏,从而影响系统性能,甚至导致系统崩溃。为了简化资源管理,Java 7引入了 自动资源管理(Automatic Resource Management, ARM)机制,通过try-with-resources语法极大地降低了代码的复杂性并提高了代码的安全性。


一、传统的资源管理方式

在Java 7之前,资源管理通常依赖于try-catch-finally语句来手动关闭资源。以下是一个常见的例子:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class TraditionalResourceManagement {public static void main(String[] args) {BufferedReader reader = null;try {reader = new BufferedReader(new FileReader("example.txt"));String line = reader.readLine();System.out.println(line);} catch (IOException e) {System.err.println("Error reading file: " + e.getMessage());} finally {if (reader != null) {try {reader.close();} catch (IOException e) {System.err.println("Error closing reader: " + e.getMessage());}}}}
}

存在的问题:

  1. 代码冗长:需要多次写try-catchfinally块,代码不够简洁。
  2. 易出错:如果开发者忘记在finally中关闭资源,会导致资源泄漏。
  3. 异常处理复杂:在finally块中关闭资源时,也可能会抛出异常,这增加了代码复杂性。

二、自动资源管理(try-with-resources)

为了简化资源管理,Java 7引入了try-with-resources语法,它能够自动关闭资源,不需要显式调用close()方法。

语法:

try (资源声明) {// 使用资源的代码
} catch (异常类型 e) {// 异常处理
}

资源声明是一个实现了java.lang.AutoCloseable接口的对象,try块执行完毕后,声明的资源会被自动关闭。

示例代码:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class AutoResourceManagement {public static void main(String[] args) {try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {String line = reader.readLine();System.out.println(line);} catch (IOException e) {System.err.println("Error reading file: " + e.getMessage());}}
}

优势:

  1. 简化代码finally块自动省略。
  2. 更安全:保证资源一定会被关闭,即使代码抛出异常。
  3. 代码可读性更高:开发者可以专注于核心逻辑。

三、AutoCloseableCloseable

在Java中,try-with-resources语法适用于实现了以下任一接口的资源:

  1. java.lang.AutoCloseable(Java 7引入):所有需要自动关闭的资源都可以实现这个接口。
  2. java.io.Closeable(Java 5引入):主要用于流类,继承了AutoCloseable

两者的主要区别是:

  • AutoCloseable:允许close()方法抛出任意类型的异常。
  • Closeableclose()方法只能抛出IOException

四、多个资源管理

try-with-resources支持同时管理多个资源,只需用分号分隔资源声明。

示例代码:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class MultipleResources {public static void main(String[] args) {try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"));FileWriter writer = new FileWriter("output.txt")) {String line;while ((line = reader.readLine()) != null) {writer.write(line + System.lineSeparator());}} catch (IOException e) {System.err.println("Error handling file: " + e.getMessage());}}
}

五、处理close()方法的异常

try-with-resources中,如果close()方法抛出异常,Java会将该异常作为被抑制的异常(Suppressed Exception),而不是覆盖原始异常。

示例代码:

import java.io.*;public class SuppressedExceptionExample {public static void main(String[] args) {try (TestResource resource = new TestResource()) {throw new RuntimeException("Primary Exception");} catch (Exception e) {System.err.println("Caught: " + e.getMessage());for (Throwable suppressed : e.getSuppressed()) {System.err.println("Suppressed: " + suppressed.getMessage());}}}
}class TestResource implements AutoCloseable {@Overridepublic void close() throws Exception {throw new Exception("Exception in close()");}
}

输出:

Caught: Primary Exception
Suppressed: Exception in close()

六、自定义可自动关闭的资源

只需实现AutoCloseableCloseable接口即可。

示例代码:

class MyResource implements AutoCloseable {@Overridepublic void close() throws Exception {System.out.println("Resource closed");}
}public class CustomResourceExample {public static void main(String[] args) {try (MyResource resource = new MyResource()) {System.out.println("Using resource");} catch (Exception e) {e.printStackTrace();}}
}

输出:

Using resource
Resource closed

七、与旧版本的兼容性

即使是在Java 7之前创建的类(如FileInputStreamBufferedReader等),由于它们实现了Closeable接口,所以也可以直接用于try-with-resources语法。


八、实践建议

  1. 优先使用try-with-resources:在需要管理资源时,这是最推荐的方式。
  2. 资源关闭顺序:对于多个资源,关闭顺序是按照资源声明的逆序进行。
  3. 自定义资源实现:如果你编写的类需要外部管理其资源,可以实现AutoCloseable接口。
  4. 注意异常处理:通过getSuppressed()方法可以获取抑制的异常。

九、小结

自动资源管理极大地简化了资源关闭的操作,降低了资源泄漏的风险,是现代Java开发中的重要特性。无论是文件操作、数据库连接还是其他可关闭资源,都可以通过try-with-resources语法更高效地进行管理。


希望本篇文章能帮助你深入理解Java中的自动资源管理机制。如果你觉得本文对你有帮助,记得点赞、收藏并分享哦! 😊

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

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

相关文章

【linux】(23)对象存储服务-MinIo

MinIO 是一个高性能的对象存储服务,兼容 Amazon S3 API。 Docker安装MinIo 前提条件 确保您的系统已经安装了 Docker。如果还没有安装 Docker,可以参考 Docker 官方文档进行安装。 1. 拉取 MinIO Docker 镜像 首先,从 Docker Hub 拉取 Mi…

(超详细图文)PLSQL Developer 配置连接远程 Oracle 服务

1、下载配置文件 (超详细图文详情)Navicat 配置连接 Oracle-CSDN博客 将下载的文件解压到单独文件夹,如:D:\App\App_Java\Oracle\instantclient-basic-windows.x64-19.25.0.0.0dbru 2、配置 打开 PLSQL Developer,登…

【网络篇】HTTP知识

键入网址到网页显示,期间发生了什么? 浏览器第一步是解析URL,这样就得到了服务器名称和文件的路径名,然后根据这些信息生成http请求,通过DNS查询得到我们要请求的服务器地址,然后添加TCP头、IP头以及MAC头&…

C 语言学习的经典书籍有哪些?

学习C语言的理由 C语言是一种程席设计语言,它是由美国AT&T公司贝尔实验室的Dennis Ritchie于1972年发明的。C语言之所以流行,是因为它简单易用。学习C语言的几个理由如下: (1)C、C#和Java使用一种被称为面向对象程序设计(0bject-Orient…

webrtc ios h264 硬编解码

webrtc ios h264 硬编解码 一 ios 系统支持 从ios8开始,苹果公司开放了硬解码和硬编码API(即 VideoToolbox.framework API) 二 主要api 1 主要解码函数 VTDecompressionSessionCreate // 创建解码 session VTDecompressionSession…

RVO动态避障技术方案介绍

原文:RVO动态避障技术方案介绍 - 哔哩哔哩 我们在开发游戏的时候经常会遇到这样的问题,当我们寻路的时候,其它人也在寻路,如何避免不从其它人的位置穿过。这个叫做动态避障,目前主流的解决方案就是RVO。本节我们来介绍…

(免费送源码)计算机毕业设计原创定制:Java+ssm+JSP+Ajax SSM棕榈校园论坛的开发

摘要 随着计算机科学技术的高速发展,计算机成了人们日常生活的必需品,从而也带动了一系列与此相关产业,是人们的生活发生了翻天覆地的变化,而网络化的出现也在改变着人们传统的生活方式,包括工作,学习,社交…

对比学习与自监督任务

对比学习与自监督任务 笔者在之前上课时候被迫接受学习了NLP的许多相关的知识,BERT GPT等许多的NLP领域的大模型,都采用了半监督或者说是无监督的训练方法,最近在视觉的领域视觉自监督的模型受到了越来越多的关注。现在需要自己了解一下自监督…

SpringCloud2~~~

Nacos Nacos就是替代 注册中心【Eureka】 和 配置中心【Config】 支持AP和CP,可以切换 了解即可 下载和运行 下载版本(找自己想要的版本):Tags alibaba/nacos GitHub 本地有良好的 Java8 Maven环境 解压安装包,直接…

Vue进阶之单组件开发与组件通信

书接上篇,我们了解了如何快速创建一个脚手架,现在我们来学习如何基于vite创建属于自己的脚手架。在创建一个新的组件时,要在新建文件夹中打开终端创建一个基本的脚手架,可在脚手架中原有的文件中修改或在相应路径重新创建&#xf…

VPS默认是通过密钥文件登陆机器,编译~让机器能直接通过root密码登陆。

SSH 登录机器 登陆机器 输入命令切换到root权限并修改密码: sudu su #切换root权限psddwd #修改密码 修改登陆方式 输入命令: vi /root/.ssh/authorized_keys 找到 “ssh-rsa”字样, 按键盘 ” i ” 进入编辑模式&#xf…

map用于leetcode

//第一种map方法 function groupAnagrams(strs) {let map new Map()for (let str of strs) {let key str ? : str.split().sort().join()if (!map.has(key)) {map.set(key, [])}map.get(key).push(str)} //此时map为Map(3) {aet > [ eat, tea, ate ],ant > [ tan,…

文件比较和文件流

文件比较和文件流 一、文本比较工具 diff1.基本用法1.1输出格式 2.常用选项 二、文件流1.文件的打开模式2.文件流的分类ifstreamofstreamfstrem区别 3.文件流的函数1. 构造函数2. is_open 用于判断文件是否打开3. open4. getline5. close6. get()7. read8. write9. put10. gcou…

《如何使用Unity的Avatar人偶以及启动重定向-实现2个或多个人物模型使用同一个动画片段》

8.5 使用Avatar和人物重定向 注意事项: 这个人偶以及重定向技术只能作用于人物模型! 这个人偶以及重定向技术只能作用于人物模型! 这个人偶以及重定向技术只能作用于人物模型! 1. 基本原理 在Unity中,Avatar人偶和…

windows 应用 UI 自动化实战

UI 自动化技术架构选型 UI 自动化是软件测试过程中的重要一环,网络上也有很多 UI 自动化相关的知识或资料,具体到 windows 端的 UI 自动化,我们需要从以下几个方面考虑: 开发语言 毋庸置疑,在 UI 自动化测试领域&am…

百度 文心一言 vs 阿里 通义千问 哪个好?

背景介绍: 在当前的人工智能领域,随着大模型技术的快速发展,市场上涌现出了众多的大规模语言模型。然而,由于缺乏统一且权威的评估标准,很多关于这些模型能力的文章往往基于主观测试或自行设定的排行榜来评价模型性能…

基于协同推荐的黔醉酒业白酒销售系统

文末获取源码和万字论文 摘 要 基于协同推荐的黔醉酒业白酒销售系统主要针对黔醉酒业的具体业务需求所设计,现阶段阶段我国大型企业都会有自己的电商平台以及销售管理系统,其功能对于中小型过于冗长复杂,成本也不是中小型企业能够承受的&…

解决jupyter notebook 新建或打开.ipynb 报500 : Internal Server Error(涉及jinja2兼容性问题)

报错: [E 10:09:52.362 NotebookApp] 500 GET /notebooks/Untitled16.ipynb?kernel_namepyt hon3 (::1) 93.000000ms refererhttp://localhost:8888/tree ...... 重点是: from .exporters import * File "C:\ProgramData\Anaconda3\lib\site-p…

Kali Linux系统一键汉化中文版及基础使用详细教程

Kali Linux系统一键汉化中文版及基础使用详细教程 引言 Kali Linux是一款基于Debian的Linux发行版,专为渗透测试和网络安全而设计。由于其强大的功能和丰富的工具,Kali Linux在安全领域得到了广泛应用。然而,许多用户在使用Kali Linux时会遇…

LLaMA-Factory 上手即用教程

LLaMA-Factory 是一个高效的大型语言模型微调工具,支持多种模型和训练方法,包括预训练、监督微调、强化学习等,同时提供量化技术和实验监控,旨在提高训练速度和模型性能。 官方开源地址:https://github.com/hiyouga/L…