Java文件拷贝推荐优先使用NIO的Files.copy(),一行代码完成且自动优化;传统IO需用缓冲字节数组和try-with-resources确保安全;实际应用要处理目录递归、进度反馈、权限保留及中断支持。

Java开发文件拷贝工具,核心在于正确使用InputStream和OutputStream(或NIO的Files.copy()),关键不是写多复杂,而是选对方式、处理好异常、避免内存溢出。
用传统IO流实现安全拷贝
适合小到中等文件(如几百MB以内),逻辑清晰,便于理解底层过程。
- 用
FileInputStream读源文件,FileOutputStream写目标文件,不要直接用FileReader/FileWriter——它们是字符流,会破坏二进制内容(如图片、jar包) - 务必使用带缓冲的字节数组(如
byte[] buffer = new byte[8192]),单字节读写极慢 - 必须在
finally块或try-with-resources中关闭流,否则文件句柄泄漏 - 示例片段:
try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest)) { byte[] buf = new byte[8192]; int len; while ((len = in.read(buf)) != -1) { out.write(buf, 0, len); } }
用NIO Files.copy()快速完成(推荐新手)
JDK 7+ 提供的Files.copy()方法封装了底层细节,一行代码就能完成拷贝,且自动处理大文件优化。
- 支持
StandardCopyOption.REPLACE_EXISTING覆盖已有文件 - 能识别符号链接,可选是否跟随(默认不跟随)
- 注意:源路径和目标路径必须是
Path对象,可用Paths.get("xxx")转换 - 示例:
try { Files.copy(srcPath, destPath, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { System.err.println("拷贝失败:" + e.getMessage()); }
处理常见实际问题
真实场景中不能只管“能拷”,还要考虑健壮性和用户体验。
立即学习“Java免费学习笔记(深入)”;
-
目录拷贝需递归:
Files.copy()只支持单文件。要拷整个文件夹,得先用Files.walk()遍历,再逐个创建目录、拷贝文件 - 进度反馈:大文件拷贝时用户需要知道进度。可在传统IO循环中累计已读字节数,配合总大小计算百分比,通过回调或打印日志输出
-
权限与属性保留:默认拷贝不保留文件时间戳、读写权限。NIO中可用
Files.copy()配合LinkOption.NOFOLLOW_LINKS和后续Files.setLastModifiedTime()等手动同步 -
中断支持:长任务建议检查
Thread.interrupted(),允许用户主动取消
简单命令行工具结构建议
做一个可用的小工具,不需要GUI,几行代码就能启动。
- 主类接收两个参数:
java CopyTool source.txt dest.txt - 解析参数后校验源文件是否存在、是否为普通文件;目标父目录是否存在,不存在则创建(
Files.createDirectories()) - 调用NIO拷贝,捕获
IOException并友好提示(如“源文件不存在”、“磁盘空间不足”) - 成功后打印“拷贝完成,共xxx字节”,增强确定感
不复杂但容易忽略细节。从NIO的Files.copy()起步,再逐步加入进度、目录、异常细分,就是一条平滑的学习路径。










