Files.copy默认不覆盖、不建父目录,需显式传入REPLACE_EXISTING覆盖文件,COPY_ATTRIBUTES保留属性,创建父目录须先调用createDirectories,复制目录需配合walk递归实现。

复制文件:用 Files.copy 配合选项控制行为
Files.copy 是最直接的复制方式,但要注意它默认不覆盖、不建父目录。常见组合如下:
- 覆盖已存在目标:Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING)
- 保留原文件属性(如修改时间):Files.copy(src, dst, StandardCopyOption.COPY_ATTRIBUTES)
- 复制时自动创建缺失的父目录:需手动补全——先调用 Files.createDirectories(dst.getParent()),再执行 copy
- 复制整个目录?Files.copy 不支持直接复制非空目录,需配合 Files.walk + Files.copy 实现递归复制
删除文件或空目录:delete 和 deleteIfExists 的区别
Files.delete 是“严格模式”,路径不存在、目标非空、权限不足都会抛 IOException;而 deleteIfExists 更适合日常使用:
- Files.delete(path):确保删除成功才继续,适合关键流程中强依赖清理结果的场景
- Files.deleteIfExists(path):不报错、不中断,适合清理临时文件、备份等可选操作
- 删除非空目录?必须先递归清空。推荐写法:Files.walk(path).sorted(Comparator.reverseOrder()).forEach(Files::delete),从子项向上删,避免“目录非空”异常
安全操作前建议加一层校验
避免因路径状态不明导致异常中断,几行判断就能提升健壮性:
- 检查是否存在:Files.exists(path)
- 区分是文件还是目录:Files.isRegularFile(path) 或 Files.isDirectory(path)
- 确认可写:Files.isWritable(path)(尤其在跨用户或容器环境中很有用)
小技巧:临时文件和批量处理更省心
如果只是临时存一份副本,可用 createTempFile 自动管理路径和命名;若要批量复制/删除多个文件,结合 try-with-resources + Files.list 或 Files.walk 配合流式处理,比传统 File 遍历更简洁高效。
立即学习“Java免费学习笔记(深入)”;


















