java中try-with-resources要求流对象在try括号内声明且实现autocloseable接口,jdk标准i/o类均满足;多资源按声明逆序关闭,确保装饰器模式正确释放;close()异常被抑制并可通过getsuppressed()获取;自定义流需显式实现autocloseable并保证close()幂等。

Java 中 IO 流利用 JDK 7 的 try-with-resources 自动释放资源,核心是让流对象在 try 括号内声明,且该流类型必须实现 AutoCloseable 接口——JDK 标准 I/O 类(如 FileInputStream、BufferedReader、OutputStream 等)都已满足这一条件,因此可直接使用,无需手动调用 close()。
资源声明必须在 try 括号内完成
不能复用外部变量(JDK 7/8 不支持“有效 final”变量传入),必须在括号中直接创建:
- ✅ 正确:
try (BufferedReader br = new BufferedReader(new FileReader("a.txt"))) { ... } - ❌ 错误:
FileReader fr = new FileReader("a.txt"); try (BufferedReader br = new BufferedReader(fr)) { ... }(JDK 7/8 编译失败)
多流嵌套时关闭顺序必须符合依赖关系
多个资源用分号分隔,JVM 按**声明逆序**关闭(后声明的先关),这对装饰器模式(如 BufferedInputStream 包裹 FileInputStream)至关重要:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- ✅ 正确:先声明底层流,再声明包装流
try (FileInputStream fis = new FileInputStream("in.txt");<br> BufferedInputStream bis = new BufferedInputStream(fis)) { ... }
→bis.close()先执行(刷新缓冲区),再fis.close() - ❌ 错误:颠倒顺序会导致
Stream closed异常
异常处理需注意被抑制的 close 异常
如果 try 块抛出异常,且某个 close() 也抛异常,后者不会覆盖前者,而是被“抑制”并附加到主异常上:
- 主异常仍正常抛出,可通过
e.getSuppressed()获取被抑制的异常数组 - 即使第一个
close()失败,后续资源仍会继续关闭 - 避免在
close()中做耗时或非幂等操作(如重试网络请求),应轻量、快速、可重复调用
自定义流类要显式实现 AutoCloseable
若自己封装了带资源管理的类(如含文件句柄、Socket 连接),必须:
- 声明
implements AutoCloseable - 重写
public void close() throws Exception,并在其中释放底层资源 - 确保
close()幂等:多次调用不报错、不重复释放
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










