java中try-with-resources可自动关闭实现autocloseable接口的资源,需在try括号内声明初始化,多资源按逆序关闭,异常时仍保证close执行且支持抑制异常,自定义类实现autocloseable即可。

Java 中 try-with-resources 能自动关闭文件流,前提是该流实现了 AutoCloseable 接口(InputStream、OutputStream、FileReader、FileWriter 等都实现了),且在 try 后的括号中正确声明资源。
资源必须在 try 括号中声明
只有在 try 后的圆括号里初始化并赋值的资源,才会被自动关闭。不能在 try 块内部 new 出来,否则不会受管理。
- ✅ 正确写法:try (FileInputStream fis = new FileInputStream("a.txt")) { ... }
- ❌ 错误写法:FileInputStream fis = new FileInputStream("a.txt"); try { ... }(不会自动关闭)
多个资源用分号隔开,按声明逆序关闭
可以一次声明多个资源,用分号分隔。JVM 会按声明的**相反顺序**依次调用 close(),确保依赖关系安全(比如先关子流,再关包装流)。
- 例如:try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt")); OutputStream out = new FileOutputStream("b.txt")) { ... }
- 执行完后,out 先关闭,bis 后关闭
即使发生异常,close() 也会执行
无论 try 块中是否抛出异常、return 或 break,所有已成功初始化的资源都会被调用 close()。如果 close() 自身也抛异常,它会被抑制(suppressed),主异常仍会被抛出,可通过 Throwable.getSuppressed() 获取。
- 不需要手动写 finally 块去 close
- 也不用担心“流没关导致文件句柄泄漏”
自定义类支持 try-with-resources 的方法
只要让类实现 AutoCloseable 接口,并重写 close() 方法即可。
- 示例:class MyResource implements AutoCloseable { public void close() { System.out.println("closed"); } }
- 之后就能写:try (MyResource r = new MyResource()) { ... }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











