java中文件复制和移动最推荐的方式是使用java.nio.file.files类的copy()和move()方法,它们底层调用操作系统优化的native机制(如sendfile),支持原子性、覆盖选项与属性保留,代码简洁高效,性能远超传统io流。

Java 中文件复制和移动最快速、推荐的方式是使用 java.nio.file.Files 类提供的静态方法,底层基于操作系统优化的 native 调用(如 sendfile、copy_file_range),比传统字节流或字符流快得多,且代码简洁、自动处理资源和异常。
用 Files.copy() 快速复制文件
适用于单个文件复制,支持覆盖、保留属性等选项:
- 基础复制(目标不存在时):
Files.copy(source, target); - 强制覆盖已有文件:
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); - 复制并保留最后修改时间等基本属性:
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES); - 注意:source 和 target 是
Path对象,可用Paths.get("a.txt")获取
用 Files.move() 快速移动/重命名文件
移动本质是原子性操作(同磁盘下为 rename,跨磁盘会先复制再删除),性能极高:
- 基础移动:
Files.move(source, target); - 覆盖目标文件:
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING); - 不替换时若目标存在会抛
FileAlreadyExistsException,可提前检查Files.exists(target)
批量复制或移动目录(含子目录)
Files.copy() 和 Files.move() 默认不递归。需手动遍历,但可复用 NIO 的高效 I/O:
- 推荐用
Files.walk()遍历源目录,对每个源路径计算对应目标路径,再调用Files.copy()或Files.move() - 示例逻辑:遍历 source 目录 → 构造 target 对应路径(如
target.resolve(source.relativize(current)))→ 创建父目录 → 复制 - 避免用
FileUtils.copyDirectory()(Apache Commons)等第三方工具,除非项目已依赖;原生方案更轻量、可控
注意事项和性能关键点
真正影响速度的不是写法,而是系统级行为:
- 同文件系统内移动几乎瞬时(仅更新 inode 引用),跨文件系统等于复制+删除
- 大文件复制时,确保目标磁盘有足够空间,否则中途失败且可能残留临时数据
- 不要用
FileInputStream/FileOutputStream手动缓冲复制——NIO 的Files.copy()在 Linux/macOS 上会尝试调用零拷贝系统调用,效率高出数倍 - Windows 上部分 NTFS 操作也支持快速 copy,效果明显
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











