程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Java8新特性

    • Java8新特性简介
    • Lambda 表达式
    • 函数式接口
    • 方法的引用
    • 构造器和数组的引用
    • Stream 流式编程
    • 并行流与串行流
    • Optional 类的使用
    • 对反射的支持增强
    • 接口中的默认方法与静态方法
    • 新时间日期API
    • Try-with-Resources 升级
      • 1. 传统的资源管理方式(Java 7 之前)
      • 2. Java 7 引入的 try-with-resources 语法
      • 3. Java 9 中的增强:外部资源实例化
      • 4. 实际开发中的应用场景
        • 4.1 文件读取
        • 4.2 数据库连接
        • 4.3 网络连接
    • 重复注解与类型注解
  • Java9新特性

  • Java10新特性

  • Java11新特性

  • Java12新特性

  • Java13新特性

  • Java14新特性

  • Java15新特性

  • Java新特性
  • Java8新特性
scholar
2024-08-24
目录

Try-with-Resources 升级

# Try-with-Resources 升级

前言

在 Java 7 之前,资源管理一直是 Java 开发中比较繁琐和容易出错的部分。通常,我们需要在 finally 块中手动关闭资源,确保资源在使用完后能够被正确释放。但是,这种写法不仅冗长,还容易在异常处理不当的情况下导致资源泄漏。

  • 1. 传统的资源管理方式(Java 7 之前)
  • 2. Java 7 引入的 try-with-resources 语法
  • 3. Java 9 中的增强:外部资源实例化
  • 4. 实际开发中的应用场景
    • 4.1 文件读取
    • 4.2 数据库连接
    • 4.3 网络连接

# 1. 传统的资源管理方式(Java 7 之前)

在 Java 7 之前,开发者必须在 try-catch 块中手动关闭资源,并在 finally 块中处理可能的异常。这种写法虽然可以确保资源被关闭,但代码显得非常繁琐。

public void testTry1() {
    InputStreamReader reader = null;
    try {
        // 手动实例化资源
        reader = new InputStreamReader(System.in);
        // 读取数据的过程(略)
        reader.read();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        // 资源的关闭操作,确保资源被释放
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 2. Java 7 引入的 try-with-resources 语法

为了解决资源关闭的问题,Java 7 引入了 try-with-resources 语法。它允许我们将资源的初始化放在 try 的括号中,系统会在 try 块执行完毕后自动关闭资源,而无需手动编写 finally 块。该特性显著简化了代码,并减少了出错的可能性。

public void testTry2() {
    // 使用 try-with-resources 自动关闭资源
    try (InputStreamReader reader = new InputStreamReader(System.in)) {
        // 读取数据的过程(略)
        reader.read();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
1
2
3
4
5
6
7
8
9

注意事项:

  • 在 Java 7 中,资源必须在 try 的括号中实例化。
  • 资源类需要实现 AutoCloseable 接口,常见的如 InputStream, OutputStream, Reader, Writer 等。

# 3. Java 9 中的增强:外部资源实例化

Java 9 进一步增强了 try-with-resources,允许资源在 try 外部实例化,然后在 try 括号中引用。这使得代码更加灵活,特别是在需要在多个 try 块中复用同一资源时。

public void testTry3() {
    // 在 try 外部实例化资源
    InputStreamReader reader = new InputStreamReader(System.in);
    // 在 try 括号中引用资源
    try (reader) {
        // 读取数据的过程(略)
        reader.read();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
1
2
3
4
5
6
7
8
9
10
11

注意事项:

  • 资源仍需实现 AutoCloseable 接口。
  • 引用的资源必须是有效的 final 变量,即该变量在赋值后不可再被修改。

# 4. 实际开发中的应用场景

在实际开发中,try-with-resources 常用于处理 IO 操作、数据库连接、网络连接等场景。以下是一些典型的应用:

# 4.1 文件读取

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileReadingExample {
    public static void readFile(String filePath) {
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 4.2 数据库连接

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DatabaseConnectionExample {
    public static void insertData(String url, String user, String password, String query) {
        try (Connection conn = DriverManager.getConnection(url, user, password);
             PreparedStatement pstmt = conn.prepareStatement(query)) {
            pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 4.3 网络连接

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class NetworkConnectionExample {
    public static void fetchData(String urlString) {
        try {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");

            try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
                String inputLine;
                StringBuilder content = new StringBuilder();
                while ((inputLine = in.readLine()) != null) {
                    content.append(inputLine);
                }
                System.out.println(content.toString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

总结

  • 简化资源管理:try-with-resources 极大地简化了资源管理,减少了手动关闭资源的繁琐代码。
  • 增强代码灵活性:Java 9 的增强允许外部实例化资源,使得复用资源更加方便。
  • 广泛应用:try-with-resources 在文件、数据库、网络等常见开发场景中都有广泛应用,是开发中处理资源的首选方式。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
新时间日期API
重复注解与类型注解

← 新时间日期API 重复注解与类型注解→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式