Java中try-with-resources结合BufferedReader可自动关闭资源,推荐用Files.newBufferedReader指定UTF-8编码;逐行读取用while循环,大文件避免readAllLines;多资源用分号隔开,按声明逆序关闭。

Java 中 try-with-resources 结合 BufferedReader 读取文件(或其它字符流)非常简洁安全,核心是让 BufferedReader 自动关闭,无需手动调用 close(),也避免了传统 try-catch-finally 的冗余代码。
确保资源可自动关闭
BufferedReader 实现了 AutoCloseable 接口,可以直接用于 try-with-resources。但注意:它包装的底层流(如 FileReader、InputStreamReader)也必须是可关闭的——通常没问题,但若传入的是已关闭的流或不支持关闭的包装器,可能抛出异常。
- 推荐用
Files.newBufferedReader(Path, Charset):它内部自动管理FileChannel和编码,更现代、健壮 - 避免手动 new
FileReader(不支持指定编码,用默认平台编码,易乱码)
基本写法:逐行读取文件
最常见场景是读取文本文件每一行:
Path path = Paths.get("data.txt");
try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
// 处理读取或关闭时的 IO 异常
e.printStackTrace();
}
这里 reader 在 try 块结束时自动关闭,哪怕循环中发生异常或提前 return,关闭动作仍会执行。
立即学习“Java免费学习笔记(深入)”;
读取多行并收集到集合
如果想一次性读取全部行(适合小文件),可用 Files.readAllLines(),但它不使用 BufferedReader;若坚持用 BufferedReader + try-with-resources,可手动收集:
List<String> lines = new ArrayList<>();
try (BufferedReader reader = Files.newBufferedReader(path, UTF_8)) {
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
}
注意:大文件慎用此方式,避免内存溢出;优先考虑流式处理(如上面的 while 循环)。
嵌套资源:同时管理多个流
如果需要先读取再解析(例如读取 CSV 后用 OpenCSV),且多个资源都需关闭,可在同一 try 括号中声明多个资源,用分号隔开:
try (BufferedReader reader = Files.newBufferedReader(path, UTF_8);
CSVReader csvReader = new CSVReader(reader)) {
List<String[]> records = csvReader.readAll();
// 处理数据
}
关闭顺序与声明顺序相反:先关 csvReader,再关 reader(前提是 CSVReader 本身也实现了 AutoCloseable 并正确委托关闭)。


















