java的try-with-resources可自动关闭autocloseable资源,如文件复制中的inputstream和outputstream,按声明逆序调用close(),避免finally手动关闭;推荐优先使用files.copy()一行完成复制,仅需自定义逻辑时才手动配合try-with-resources管理流。

Java 的 try-with-resources 能自动关闭资源,避免手动写 finally 块,特别适合文件复制这类需要同时管理多个流的场景。核心是让所有实现 AutoCloseable 的资源(如 InputStream、OutputStream)在 try 括号中声明,JVM 会在语句块结束时按逆序自动调用 close()。
一步声明输入输出流,不用 finally
传统方式要手动关闭两个流,容易遗漏或出错;用 try-with-resources 后,即使复制过程中抛异常,流也会被安全关闭:
- 把
FileInputStream和FileOutputStream都放在 try 后的括号里,用分号隔开 - JVM 确保无论是否发生异常,两个流都会被调用
close() - 不再需要单独的
finally块,代码更短、更可靠
配合 try-with-resources 使用 NIO.2 的 Files.copy(推荐)
如果只是普通文件复制,最简方案是直接用 Files.copy(),它内部已处理资源管理,无需显式声明流:
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING)- 底层自动使用缓冲和资源清理,一行搞定,且支持大文件
- 仅当需自定义逻辑(如进度监听、部分复制、格式转换)时,才手动用流 + try-with-resources
手动流复制时注意流顺序和异常覆盖
多个资源在 try 括号中按从左到右声明,但关闭顺序是逆序(后声明的先关闭),这对某些依赖关系很重要:
- 例如:先声明
InputStream,再声明OutputStream,则OutputStream先关闭 - 若复制中途抛异常,
close()过程中再抛新异常,会以“suppressed exception”形式附加到主异常上,可通过getSuppressed()查看 - 建议捕获
IOException并明确提示“复制失败”,而不是忽略异常
不复杂但容易忽略:只要资源类型实现了 AutoCloseable,就值得放进 try-with-resources —— 文件复制正是它的典型用武之地。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











