java中try-with-resources是处理文件i/o流最安全简洁的方式,它自动关闭实现autocloseable接口的资源(如fileinputstream等),避免资源泄漏;资源必须在try括号内声明且为final或等效final,jvm按声明逆序调用close(),支持多资源及抑制异常机制。

Java 中 try-with-resources 是处理文件 I/O 流最安全、简洁的方式,它能自动关闭实现了 AutoCloseable 接口的资源(如 FileInputStream、FileOutputStream、BufferedReader、BufferedWriter 等),避免因忘记调用 close() 导致的资源泄漏或文件句柄耗尽。
基本写法:在 try 括号内声明流对象
资源必须在 try 后的圆括号中声明,且必须是 final 或等效 final(即不被重新赋值)。JVM 会在 try 块结束(无论正常完成还是抛出异常)后,按声明逆序自动调用 close() 方法。
- 支持多个资源,用分号隔开
- 每个资源独立关闭,即使前一个
close()抛异常,后续仍会尝试关闭(Java 7+ 的“抑制异常”机制会将后续异常附加到主异常上) - 无需手动写
finally块或显式调用close()
示例:读取文本文件并逐行打印
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("读取文件失败: " + e.getMessage());
}
同时处理输入和输出流(如复制文件)
可以一次性声明多个流,比如用 BufferedInputStream 读、BufferedOutputStream 写,try-with-resources 会确保两者都正确关闭。
try (BufferedInputStream in = new BufferedInputStream(new FileInputStream("src.jpg"));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("dst.jpg"))) {
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
} catch (IOException e) {
System.err.println("文件复制失败: " + e.getMessage());
}
注意:资源必须是可关闭的,且不能在 try 外创建
以下写法是错误的 —— 资源不是在 try 括号中直接初始化,会导致编译失败:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
FileInputStream fis = new FileInputStream("file.txt"); // ❌ 不合法
try (fis) { ... }
正确写法必须是:
try (FileInputStream fis = new FileInputStream("file.txt")) { ... } // ✅
如果需要复用已有流变量,可考虑用普通 try-catch + finally,但不推荐;更优解是重构逻辑,让资源生命周期清晰可控。
自定义资源类也支持 try-with-resources
只要实现 AutoCloseable 接口并提供 public void close() throws Exception 方法,就能用于 try-with-resources。例如封装一个带日志的文件写入器:
class LoggingFileWriter implements AutoCloseable {
private final FileWriter writer;
LoggingFileWriter(String path) throws IOException {
this.writer = new FileWriter(path);
}
void writeLine(String line) throws IOException {
writer.write(line + "\n");
}
@Override
public void close() throws IOException {
System.out.println("正在关闭文件...");
writer.close();
}
}
// 使用
try (LoggingFileWriter lw = new LoggingFileWriter("log.txt")) {
lw.writeLine("操作开始");
lw.writeLine("操作完成");
} // 自动触发 close()
不复杂但容易忽略:确保所用的 JDK 版本 ≥ 7,且所有流类型确实实现了 AutoCloseable(标准 I/O 类基本都满足)。合理使用 try-with-resources,能让文件 I/O 更健壮、代码更干净。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










