try-with-resources 通过在 try 括号中声明实现 AutoCloseable 的资源(如 FileInputStream、BufferedReader),实现自动关闭,无需手动 close() 或 finally;多资源用分号隔开,按声明逆序关闭。

用 try-with-resources 编写 IO 读取代码,核心是让资源自动关闭,避免手动调用 close(),同时保持逻辑清晰、代码简洁。
资源声明写在 try 括号里
把可关闭的资源(如 FileInputStream、BufferedReader)直接声明在 try 后的圆括号中,Java 会在 try 块结束时自动调用它们的 close() 方法,无论是否发生异常。
- 资源类必须实现
AutoCloseable接口(JDK 中的大多数 IO 类都满足) - 多个资源用分号隔开,关闭顺序与声明顺序相反(后声明的先关闭)
- 不需要 catch 或 finally 块来关流,除非你要处理业务异常
一行读取文本文件内容(推荐常用场景)
读取小文件内容到字符串,用 Files.readString() 最简洁——但它底层也依赖 try-with-resources,且自动处理字符编码:
String content = Files.readString(Paths.get("data.txt"), StandardCharsets.UTF_8);
如果需要逐行处理或兼容老版本 JDK(BufferedReader:
立即学习“Java免费学习笔记(深入)”;
try (BufferedReader reader = Files.newBufferedReader(Paths.get("data.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
组合多个资源时注意嵌套关系
比如用 InputStreamReader 包装 FileInputStream,应优先使用更高级的封装(如 Files.newBufferedReader),避免手动嵌套;若必须组合,把最外层资源(通常是装饰器)放在 try 括号里即可:
try (FileInputStream fis = new FileInputStream("data.txt");
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr)) {
// 使用 br 读取
}
此时三个资源都会被自动关闭,无需担心关闭顺序出错。
捕获并处理 IO 异常
try-with-resources 不影响异常处理逻辑。常见做法是捕获 IOException,必要时再包装成运行时异常:
try (BufferedReader reader = Files.newBufferedReader(Paths.get("data.txt"))) {
return reader.lines().collect(Collectors.toList());
} catch (IOException e) {
throw new UncheckedIOException("读取文件失败", e);
}
注意:如果 try 块中抛出异常,且资源关闭时也抛出异常,后者会作为 suppressed exception 被添加到主异常中,可通过 getSuppressed() 获取。


















