本文目录导读:

我来为你展示Java中try-with-resources的多个实用案例,从基础到高级。
基础用法:文件操作
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BasicExample {
public static void main(String[] args) {
// 自动关闭文件资源
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
多资源管理
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
public class MultiResourceExample {
public static void copyFile(String source, String target) {
// 同时管理多个资源,按声明顺序逆序关闭
try (InputStream in = Files.newInputStream(Paths.get(source));
OutputStream out = Files.newOutputStream(Paths.get(target))) {
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
System.out.println("文件复制成功!");
} catch (IOException e) {
System.err.println("复制失败: " + e.getMessage());
}
}
}
自定义资源类
public class CustomResourceExample {
// 自定义资源类,实现 AutoCloseable 接口
static class DatabaseConnection implements AutoCloseable {
private String name;
public DatabaseConnection(String name) {
this.name = name;
System.out.println("打开数据库连接: " + name);
}
public void query(String sql) {
System.out.println("执行查询: " + sql);
if (sql.contains("error")) {
throw new RuntimeException("查询失败!");
}
}
@Override
public void close() {
System.out.println("关闭数据库连接: " + name);
}
}
public static void main(String[] args) {
// 无论是否发生异常,都会自动关闭资源
try (DatabaseConnection conn = new DatabaseConnection("Oracle")) {
conn.query("SELECT * FROM users");
conn.query("error - 触发异常");
} catch (RuntimeException e) {
System.out.println("捕获异常: " + e.getMessage());
}
}
}
资源与异常处理
import java.io.*;
public class ExceptionHandlingExample {
// 演示 suppress exception(被抑制的异常)
public static void showSuppressedExceptions() {
try (BufferedReader reader = new BufferedReader(
new FileReader("nonexistent.txt"))) {
String line = reader.readLine();
} catch (IOException e) {
System.out.println("主异常: " + e.getMessage());
Throwable[] suppressed = e.getSuppressed();
if (suppressed.length > 0) {
System.out.println("被抑制的异常数量: " + suppressed.length);
for (Throwable t : suppressed) {
System.out.println(" 抑制异常: " + t.getMessage());
}
}
}
}
// 传统方式的对比
public static void traditionalWay() throws IOException {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("test.txt"));
String line = reader.readLine();
} finally {
if (reader != null) {
reader.close(); // 必须手动关闭,且可能掩盖主异常
}
}
}
// 新方式的对比 - 更简洁
public static void modernWay() throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
String line = reader.readLine();
} // 自动关闭
}
}
网络资源管理
import java.io.*;
import java.net.Socket;
import java.net.URL;
public class NetworkResourceExample {
// 管理网络连接
public static void downloadContent(String urlString) {
try (Socket socket = new Socket("example.com", 80);
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream()) {
// 发送HTTP请求
String request = "GET " + urlString + " HTTP/1.1\r\n" +
"Host: example.com\r\n" +
"Connection: close\r\n\r\n";
os.write(request.getBytes());
os.flush();
// 读取响应
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, bytesRead));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
互斥锁资源
import java.util.concurrent.locks.ReentrantLock;
public class LockResourceExample {
private static ReentrantLock lock = new ReentrantLock();
// 自定义AutoCloseable的锁
static class LockHelper implements AutoCloseable {
public LockHelper() {
lock.lock();
System.out.println("获取锁");
}
@Override
public void close() {
lock.unlock();
System.out.println("释放锁");
}
}
public static void main(String[] args) {
// 使用try-with-resources自动管理锁
try (LockHelper helper = new LockHelper()) {
System.out.println("执行临界区代码");
// 业务逻辑...
}
}
}
结合Lambda表达式
import java.io.*;
import java.nio.file.*;
public class FunctionalExample {
public static void processFile(String filePath) {
// 更简洁的写法,支持链式操作
try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
lines.filter(line -> !line.startsWith("#")) // 过滤注释
.map(String::trim) // 去除空格
.filter(line -> !line.isEmpty()) // 过滤空行
.forEach(System.out::println); // 打印
} catch (IOException e) {
System.err.println("读取文件失败: " + e.getMessage());
}
}
}
数据库连接管理(模拟)
import java.sql.*;
public class DatabaseExample {
public static void queryUsers() {
String url = "jdbc:mysql://localhost:3306/mydb";
String user = "root";
String password = "password";
// JDBC 7+ 支持try-with-resources
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
while (rs.next()) {
System.out.println("用户: " + rs.getString("name"));
}
} catch (SQLException e) {
System.err.println("数据库操作失败: " + e.getMessage());
}
}
}
实际项目中的完整示例
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
public class RealWorldExample {
public static class User {
private String name;
private String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
@Override
public String toString() {
return "User{name='" + name + "', email='" + email + "'}";
}
}
// 从CSV文件读取用户数据
public static List<User> readUsersFromCsv(String filePath) {
List<User> users = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(filePath),
StandardCharsets.UTF_8))) {
String line;
boolean firstLine = true;
while ((line = reader.readLine()) != null) {
if (firstLine) { // 跳过表头
firstLine = false;
continue;
}
String[] parts = line.split(",");
if (parts.length >= 2) {
users.add(new User(parts[0].trim(), parts[1].trim()));
}
}
} catch (FileNotFoundException e) {
System.err.println("文件不存在: " + e.getMessage());
} catch (IOException e) {
System.err.println("读取文件错误: " + e.getMessage());
}
return users;
}
// 将用户数据写入JSON文件(简化版)
public static void writeUsersToJson(List<User> users, String filePath) {
try (BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(filePath),
StandardCharsets.UTF_8))) {
writer.write("[");
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
if (i > 0) writer.write(",");
writer.write(String.format(
"\n {\"name\": \"%s\", \"email\": \"%s\"}",
user.name, user.email
));
}
writer.write("\n]");
System.out.println("成功写入 " + users.size() + " 个用户到 " + filePath);
} catch (IOException e) {
System.err.println("写入文件错误: " + e.getMessage());
}
}
public static void main(String[] args) {
// 完整流程示例
List<User> users = readUsersFromCsv("users.csv");
users.forEach(System.out::println);
writeUsersToJson(users, "users.json");
}
}
高级技巧:封装资源管理
import java.io.*;
import java.util.function.Consumer;
public class ResourceWrapperExample {
// 通用的资源处理器
public static <T extends AutoCloseable> void withResource(
ResourceFactory<T> factory,
Consumer<T> consumer,
String resourceName) {
try (T resource = factory.create()) {
consumer.accept(resource);
} catch (Exception e) {
System.err.printf("处理资源 '%s' 失败: %s%n",
resourceName, e.getMessage());
}
}
@FunctionalInterface
interface ResourceFactory<T> {
T create() throws Exception;
}
static class TempFile implements AutoCloseable {
public TempFile(String name) {
System.out.println("创建临时文件: " + name);
}
public void write(String content) {
System.out.println("写入内容: " + content);
}
@Override
public void close() {
System.out.println("删除临时文件");
}
}
public static void main(String[] args) {
// 使用通用处理器
withResource(
() -> new TempFile("temp.txt"),
file -> file.write("测试内容"),
"临时文件"
);
}
}
- 自动关闭:不用手动调用
close()方法 - 多资源管理:可同时管理多个资源
- 异常处理:主异常不会被覆盖,额外异常作为抑制异常加入
- 简洁代码:减少finally块的使用
- 自定义资源:实现
AutoCloseable接口即可 - 顺序保证:资源按声明顺序的逆序关闭
使用try-with-resources能让代码更安全、更简洁,是现代Java开发中的推荐实践!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播