java中try-with-resources通过在try括号内声明autocloseable流对象(如filereader、bufferedreader等)实现自动关闭,无需finally;支持单流、嵌套流(仅声明最外层)、多流逗号分隔,要求流为final或effectively final,且不可手动close。

Java 中用 try-with-resources 编写文件读取流,核心是让实现了 AutoCloseable 接口的流对象(如 FileInputStream、BufferedReader)在 try 括号内声明,JVM 会自动调用其 close() 方法,无需手动写 finally 块。
基本写法:单个流直接声明
适用于简单场景,比如只读一个文本文件:
try (FileReader reader = new FileReader("data.txt")) {
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
}
这里 FileReader 实现了 AutoCloseable,try 结束后自动关闭,即使发生异常也保证执行。
嵌套流推荐:用带缓冲的包装流(推荐写法)
实际开发中常组合使用流(如 FileInputStream → InputStreamReader → BufferedReader),只需在 try 括号中声明最外层的流即可,它内部会自动关闭被包装的底层流:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 声明
BufferedReader即可,不用单独声明FileReader或InputStream - 因为
BufferedReader.close()会调用其内部 reader 的close() - 示例(读取 UTF-8 文本):
try (BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("notes.txt"), "UTF-8"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
多个独立流:逗号分隔声明
如果需要同时打开多个不相关的流(比如读一个文件、写另一个文件),可在 try 括号中用分号或逗号分隔(Java 7+ 支持逗号):
try (FileInputStream fis = new FileInputStream("input.bin");
FileOutputStream fos = new FileOutputStream("output.bin")) {
int b;
while ((b = fis.read()) != -1) {
fos.write(b);
}
} catch (IOException e) {
e.printStackTrace();
}
两个流都会按声明顺序的逆序自动关闭(先 fos,再 fis),确保资源释放安全。
注意点和常见误区
- 流对象必须是 final 或 effectively final(即声明后不再重新赋值),否则编译报错
- 不要在 try 块内显式调用
close(),可能引发IOException或重复关闭 - 自定义类若要支持 try-with-resources,需实现
AutoCloseable并重写close() - 如果流构造本身抛出异常(如文件不存在),try-with-resources 不会触发 close(因为对象没创建成功)
不复杂但容易忽略:只要流类型正确、声明位置对、不手动关,try-with-resources 就能帮你稳稳兜底。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










