Files.createDirectories 是 Java NIO.2 中安全递归创建多级目录的核心方法,自动逐级创建不存在的父目录,支持权限设置、异常明确、线程安全且跨平台兼容性好。

Files.createDirectories 是 Java NIO.2 中用于安全、递归创建多级目录的核心方法,它会自动检查并逐级创建路径中所有不存在的父目录,无需手动判断或循环处理。
为什么用 createDirectories 而不是 mkdirs?
Java 7 引入的 Files.createDirectories 相比传统 File.mkdirs() 更健壮:
- 自动处理符号链接、权限拒绝、已存在但非目录等边界情况,并抛出明确异常(如 IOException、SecurityException)
- 支持传入 FileAttribute(如设置目录权限),适用于 Linux/Unix 环境的 ACL 控制
- 基于 Path 对象,与现代 NIO 流程天然契合,避免字符串路径拼接错误
基本用法:一行创建完整路径
假设你要创建路径 /home/user/logs/app/error/2024/06,其中多数目录尚不存在:
Path target = Paths.get("/home/user/logs/app/error/2024/06");
try {
Files.createDirectories(target);
} catch (IOException e) {
// 处理权限不足、磁盘满、父路径被文件占用等异常
System.err.println("创建目录失败: " + e.getMessage());
}该调用会从根开始,依次创建 logs → app → error → 2024 → 06,跳过已存在的中间目录。
配合变量动态构建路径(实战常见场景)
实际开发中路径常含变量,比如按日期、用户ID、环境名生成目录。推荐方式:
- 用
Paths.get(String...)拼接,避免手动加斜杠和平台兼容问题:Path dir = Paths.get(baseDir, "logs", env, "user_" + userId, LocalDate.now().toString()); - 对敏感变量做基础校验(如过滤路径遍历字符
..或空值),再创建:if (userId != null && !userId.contains("..")) { Files.createDirectories(dir); } - 若需设置目录权限(Linux/macOS),可传入
PosixFilePermissions:Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-x---");<br> FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);<br> Files.createDirectories(dir, attr);
注意事项与避坑点
使用时需留意几个易错细节:
- 路径末尾不能是
.或..,否则抛InvalidPathException - 若某一级已是普通文件(非目录),会抛
FileAlreadyExistsException—— 需提前清理或报错提示 - Windows 下不支持
PosixFilePermissions,跨平台项目建议用FileAttribute>包装或条件判断 - 并发场景下多个线程同时创建同一路径,
createDirectories是线程安全的,重复调用不会报错(已存在则静默成功)
掌握这个方法,就能干净利落地解决日志归档、用户上传隔离、缓存分层等典型目录初始化需求。

















