只需声明 BufferedReader 即可,因其实现 AutoCloseable 接口,close() 会自动递归关闭底层 FileReader;推荐写法为 try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {...},或更优的 Files.newBufferedReader(Paths.get("data.txt"))。

直接用 try-with-resources 声明 BufferedReader 即可,无需单独管理 FileReader —— 因为 BufferedReader 的构造器接收一个 Reader(如 FileReader),且在自身被关闭时会自动调用底层 Reader 的 close() 方法。
为什么只需声明 BufferedReader?
BufferedReader 实现了 AutoCloseable 接口,其 close() 方法内部会递归关闭它包装的底层 Reader(包括 FileReader)。所以只要 BufferedReader 被正确关闭,FileReader 就不会泄漏。
标准写法(推荐)
只需在 try 括号中声明 BufferedReader,传入新创建的 FileReader:
try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
该写法简洁安全:reader 关闭 → 自动触发 FileReader.close() → 文件句柄释放。
不推荐的冗余写法
以下方式虽语法合法,但多此一举,还可能引发重复关闭或资源管理混乱:
- 同时声明
FileReader和BufferedReader(两个资源都参与 try-with-resources) - 手动在 finally 中调用
close() - 把
FileReader提前赋值给变量再传入BufferedReader构造器,却未将其纳入资源列表
更现代的替代方案(Java 7+)
优先使用 Files.newBufferedReader(),它基于 Path,默认 UTF-8 编码,更安全、更简洁:
try (BufferedReader reader = Files.newBufferedReader(Paths.get("data.txt"))) {
// 同上处理逻辑
}
这个方法内部也封装了资源链,同样自动关闭底层通道,且避免了 FileReader 的平台默认编码陷阱。

















