replace_existing 用于覆盖已存在的普通文件,若目标为目录则抛出 filealreadyexistsexception;不指定时默认抛出异常防止误覆盖,常与 copy_attributes、nofollow_links 等组合使用。

Java NIO 的 Files.copy 方法通过 CopyOption 参数控制复制行为,其中 REPLACE_EXISTING 是最常用的覆盖控制选项。它决定目标文件已存在时是否删除并重新写入。
REPLACE_EXISTING 的作用和触发条件
当目标路径已存在且是**普通文件**时,REPLACE_EXISTING 会先删除该文件,再完成复制;如果目标是目录,则抛出 FileAlreadyExistsException(除非同时指定 NOFOLLOW_LINKS 或目标是符号链接)。
注意:它不会覆盖非空目录,也不会自动创建父目录——若目标父目录不存在,会抛出 NoSuchFileException。
常用 CopyOption 组合示例
实际使用中常与其他选项配合:
-
REPLACE_EXISTING:覆盖已有文件 -
COPY_ATTRIBUTES:尝试保留源文件的最后修改时间、权限等属性(平台依赖,不保证全部成功) -
NOFOLLOW_LINKS:不解析符号链接,直接复制链接本身(避免误复制链接指向的目标)
例如:
Files.copy(source, target, REPLACE_EXISTING, COPY_ATTRIBUTES);
不加 REPLACE_EXISTING 会发生什么?
默认情况下(不传任何 CopyOption 或只传 COPY_ATTRIBUTES),若目标文件已存在,Files.copy 直接抛出 FileAlreadyExistsException,不会覆盖。
这是安全默认策略,防止意外丢失数据。如需静默覆盖,必须显式传入 REPLACE_EXISTING。
替代方案:手动判断再复制
如果需要更精细控制(比如仅在源文件更新时才覆盖),可先检查:
- 用
Files.exists(target)判断目标是否存在 - 用
Files.getLastModifiedTime(source)和Files.getLastModifiedTime(target)比较时间戳 - 按需决定是否调用
Files.copy(..., REPLACE_EXISTING)
这种方式比单纯依赖 REPLACE_EXISTING 更灵活,但代码略多。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











