java中files.copy和files.move是基于nio.2的标准高效文件操作方法,支持原子性、符号链接处理及多种选项控制,比传统流式操作更简洁安全。

Java 中使用 Files.copy 和 Files.move 是标准且高效的方式实现文件复制与剪切(含重命名),它们基于 NIO.2,支持原子操作、符号链接处理和多种选项控制,比传统流式操作更简洁安全。
Files.copy:基础复制与高级控制
复制单个文件最常用方式是 Files.copy(source, target, options)。关键在于合理选择 CopyOption:
- StandardCopyOption.REPLACE_EXISTING:目标已存在时直接覆盖(不抛异常)
- StandardCopyOption.COPY_ATTRIBUTES:尝试复制最后修改时间、权限等元数据(Linux/macOS 下较可靠,Windows 受限)
- LinkOption.NOFOLLOW_LINKS:复制符号链接本身(而非其指向内容)
示例:安全覆盖复制并保留基本属性
Files.copy(srcPath, dstPath, REPLACE_EXISTING, COPY_ATTRIBUTES);Files.move:剪切 + 重命名一步到位
Files.move 本质是原子性移动(同一文件系统下为 rename 操作,跨卷则自动转为“复制+删除”)。它天然支持重命名,只需指定目标路径含新文件名即可:
- 同目录重命名:
move(p1, p1.resolveSibling("newname.txt")) - 跨目录剪切:
move(p1, Paths.get("/to/dir/newname.txt")) - 常用选项:REPLACE_EXISTING(覆盖目标)、ATOMIC_MOVE(强制原子性,失败则抛
AtomicMoveNotSupportedException)
注意:若目标在不同文件系统且未指定 REPLACE_EXISTING,移动可能因目标已存在而失败。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
处理目录:递归复制与移动
Files.copy 和 Files.move 默认只处理单个文件。要操作整个目录,需手动遍历:
- 用
Files.walk(source)获取所有条目,按相对路径构造目标路径 - 对每个源路径,用
resolveSibling计算对应目标路径 - 先创建目标父目录(
Files.createDirectories),再执行 copy/move - 移动目录时,只要目标父目录可写,
Files.move会自动递归移动整个树(无需手动遍历)
小技巧:复制目录前建议先检查是否为相同路径(避免自复制异常),可用 Files.isSameFile(src, dst) 判断。
异常与健壮性要点
这两个方法均声明抛出 IOException,常见需捕获的子类包括:
- SecurityException:无读/写权限(尤其在 Windows 上目标被占用时)
-
FileAlreadyExistsException:未设
REPLACE_EXISTING且目标存在 -
DirectoryNotEmptyException:对非空目录调用
move且目标已存在(某些文件系统) - AccessDeniedException:目标正在被其他进程使用(如 Excel 打开的文件)
生产代码中建议结合 try-with-resources(对流操作)或前置校验(如 Files.exists、Files.isWritable)提升容错能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










