Files.move是Java NIO.2提供的高效原子性文件移动/重命名方法,支持同目录重命名与跨目录移动,但目标不能已存在(除非指定REPLACE_EXISTING),且跨文件系统时可能退化为复制+删除。

Files.move 是 Java NIO.2 提供的文件操作方法,既能移动文件(跨目录),也能重命名(同目录下改名),底层调用的是操作系统原生的 move 操作,高效且原子性强。
基本用法:单参数形式最常用
最简洁的方式是传入两个 Path 对象,源路径和目标路径:
Path source = Paths.get("data/old.txt");
Path target = Paths.get("data/new.txt"); // 同目录 → 重命名
// 或 Paths.get("backup/old.txt") → 跨目录移动
Files.move(source, target);
注意:目标路径不能已存在(除非显式指定替换选项)。
处理目标已存在的情况
默认会抛出 FileAlreadyExistsException。要覆盖,需添加 StandardCopyOption.REPLACE_EXISTING:
立即学习“Java免费学习笔记(深入)”;
- 覆盖已有文件(包括同名文件或空目录)
- 若目标是非空目录,仍会失败(move 不支持覆盖非空目录)
示例:
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
原子性与限制
Files.move 在同一文件系统内通常是原子操作(不可中断、不会出现中间状态),但有几点要注意:
- 跨文件系统(如从 C: 移到 D:)可能退化为“复制 + 删除”,不再原子
- 不能移动目录到其子目录中(会抛出 FileSystemException)
- 目标路径的父目录必须已存在,否则抛出 NoSuchFileException
安全写法:建议加 try-catch 和父目录检查
生产环境推荐主动确保目标父目录存在,并捕获常见异常:
try {
Path target = Paths.get("output/docs/report.pdf");
Files.createDirectories(target.getParent()); // 确保上级目录存在
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
// 处理权限不足、磁盘满、路径不存在等
System.err.println("移动失败:" + e.getMessage());
}


















