java中try-with-resources可自动关闭实现autocloseable接口的资源,确保异常时仍释放资源;支持多资源分号分隔、逆序关闭;推荐用files.copy()简化小文件复制,大文件或需进度监控时再封装带回调的方法。

Java 中 try-with-resources 能自动关闭资源,避免手动写 finally 块,让文件复制的核心逻辑更简洁、安全、可读。
用 try-with-resources 替代传统 try-catch-finally
传统方式需手动关闭输入输出流,容易遗漏或出错;try-with-resources 在语句结束时自动调用 close(),即使发生异常也保证资源释放。
- 所有参与的资源必须实现
AutoCloseable接口(如FileInputStream、FileOutputStream、Files.newInputStream()等) - 多个资源用分号隔开,按声明逆序关闭(后声明的先关闭)
- 异常处理仍需 catch,但不用再操心资源是否已关
单次复制:字节流 + try-with-resources
适合小到中等文件,逻辑清晰,无需额外依赖:
try (InputStream in = new FileInputStream("src.txt");
OutputStream out = new FileOutputStream("dst.txt")) {
byte[] buf = new byte[8192];
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
} catch (IOException e) {
// 处理读写异常
}
注意:缓冲区大小(如 8192)影响性能,一般 4KB–64KB 较合理;read() 返回 -1 表示读完,不抛异常。
简化到一行:用 Files.copy() + try-with-resources(推荐)
Java 7+ 提供 Files.copy(),内部已优化,支持通道传输(零拷贝),且能直接配合 try-with-resources 管理临时通道资源:
try (ReadableByteChannel src = Files.newByteChannel(Paths.get("src.txt"), StandardOpenOption.READ);
WritableByteChannel dst = Files.newByteChannel(Paths.get("dst.txt"),
StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {
Channels.copy(src, dst); // 零拷贝,高效
} catch (IOException e) {
// 统一处理
}
更轻量写法(不显式管理通道):
try {
Files.copy(Paths.get("src.txt"), Paths.get("dst.txt"),
StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
// 文件不存在、权限不足等都归为此异常
}
这个版本最简,但注意:Files.copy() 本身不依赖 try-with-resources,因为它内部已妥善管理资源;只有当你需要自定义通道行为(如进度监听、断点续传)时,才显式用 try-with-resources 包裹通道。
处理大文件或需进度反馈?加一层封装
若需监控复制进度,可封装一个带回调的复制方法,仍用 try-with-resources 保底:
public static void copyWithProgress(Path src, Path dst, IntConsumer onProgress) throws IOException {
try (InputStream in = Files.newInputStream(src);
OutputStream out = Files.newOutputStream(dst)) {
byte[] buf = new byte[32 * 1024];
long total = 0;
long size = Files.size(src);
int n;
while ((n = in.read(buf)) != -1) {
out.write(buf, 0, n);
total += n;
onProgress.accept((int) ((total * 100) / size));
}
}
}
调用时传入 lambda 即可更新 UI 或日志,核心资源管理仍由 try-with-resources 承担。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











