是。files.createdirectories会自动递归创建所有缺失的父目录,无需手动拆分路径;若目标已存在则静默返回,若某级是文件则抛filealreadyexistsexception或ioexception。

Files.createDirectories 会自动递归创建吗?
会。只要传入的 Path 指向一个深层嵌套、完全不存在的路径(比如 /a/b/c/d),Files.createDirectories 就会逐级创建所有缺失的父目录,不需要手动拆分或循环调用。
它和 Files.createDirectory 的关键区别在于:后者只创建**最后一级**目录,且要求父目录必须已存在,否则抛 IOException;而前者是专为“确保整个路径存在”设计的递归方案。
为什么有时还是报 NoSuchFileException?
常见原因是路径末尾带了“/”或“文件名”,导致 Files.createDirectories 把它当成了一个**目录路径**去解析,但实际语义冲突。例如:
- 传入
Paths.get("/tmp/data/file.txt")→ 错误:这不是目录路径,是文件路径,方法会尝试创建file.txt这个“目录”,失败 - 传入
Paths.get("/tmp/data/")(末尾斜杠)→ 在某些文件系统或 JDK 版本下可能被截断或解析异常,不推荐
正确做法是明确提取父目录:
Path target = Paths.get("/tmp/data/file.txt");
Files.createDirectories(target.getParent()); // ← 创建 /tmp/data
需要设置目录权限吗?
默认情况下,新创建的目录权限取决于操作系统 umask 和 JVM 默认策略(如 Unix 下通常是 rwxr-xr-x),不继承父目录 ACL。如果需要显式控制,得用带 FileAttribute 的重载:
Set<posixfilepermission> perms = PosixFilePermissions.fromString("rwxr-x---");
FileAttribute<set>> attr = PosixFilePermissions.asFileAttribute(perms);
Files.createDirectories(path, attr);
</set></posixfilepermission>
注意:PosixFilePermissions 仅在支持 POSIX 的系统(Linux/macOS)有效;Windows 忽略该属性,需用 AclFileAttributeView 等替代方案。
和 mkdir -p 或 Files.createDirectory 对比有什么坑?
Files.createDirectories 是线程安全的,但不保证“原子性”——多个线程同时创建同一路径时,可能只有一个成功返回,其余抛 FileAlreadyExistsException(这是预期行为,不是错误)。处理方式应是捕获并忽略该异常:
try {
Files.createDirectories(path);
} catch (FileAlreadyExistsException ignored) {
// 路径已存在,继续
}
另外,它不会覆盖已有文件:如果某一级路径恰好是个**普通文件**(比如 /tmp/log 是个文件,你却调用 createDirectories(/tmp/log/app)),会直接抛 IOException,提示“Not a directory”。这个错误容易被当成权限问题,其实根源是路径类型冲突。
真正容易被忽略的是:它不检查路径是否可写——只有在真正写入时才暴露权限不足;也不校验路径长度或非法字符,这些都留到 OS 层抛错,堆栈里看到的可能是 InvalidPathException 或底层 IOException。










