在 Java 中读取文本文件时,通常会用 FileReader 构造 BufferedReader 来获得按行读取的能力。过去我们必须在 finally 中手动调用 close 方法,既繁琐又容易写错关闭顺序。try-with-resources 语法允许把多个资源声明在 try 后的圆括号中,JVM 会在代码块结束时自动关闭它们,且关闭顺序与声明顺序相反。

基本写法示例
下面的代码演示了如何在一个 try-with-resources 语句中同时管理 BufferedReader 与 FileReader。注意 FileReader 作为 BufferedReader 的构造参数,直接写在同一组资源声明里即可。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFileDemo {
public static void main(String[] args) {
// 在 try 后面的括号中声明资源
// FileReader 与 BufferedReader 都会自动关闭
try (FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
资源关闭顺序
当 try 块执行完毕或抛出异常时,JVM 会先调用 BufferedReader 的 close 方法,再调用 FileReader 的 close 方法。这种逆序关闭符合流包装的依赖关系,避免底层流被提前关闭导致外层流出错。
常见注意事项
- 所有被管理的资源必须实现 AutoCloseable 接口,FileReader 与 BufferedReader 均满足该要求。
- 如果资源初始化失败,比如文件不存在,已成功创建的资源仍会被关闭,未创建的不会执行关闭。
- 不要在外层再手动调用 close,否则可能抛出 IOException。
使用 try-with-resources 的好处
| 对比项 | 传统 finally 写法 | try-with-resources 写法 |
|---|---|---|
| 代码量 | 较多,需嵌套判断 | 较少,结构清晰 |
| 关闭可靠性 | 容易遗漏或顺序错 | 由 JVM 保证逆序关闭 |
| 异常处理 | 关闭异常可能覆盖原异常 | 关闭异常被抑制,可通过 getSuppressed 获取 |
通过上述方式,我们可以用简洁且安全的代码同时管理 BufferedReader 与 FileReader 的自动关闭,写出更健壮的文件处理程序。
try-with-resourcesBufferedReaderFileReader修改时间:2026-07-26 18:51:16