Files.createDirectories 创建多级目录优雅且幂等,自动创建缺失父目录;需确保路径为目录类型、正确处理 FileAlreadyExistsException 等异常,并用 Paths.get 构造跨平台路径。

用 Files.createDirectories 创建多级目录本身就很优雅——它会自动创建所有不存在的父目录,且线程安全、语义清晰、无需手动遍历路径。关键在于正确处理异常和避免冗余操作。
确保路径是目录类型,不是文件
createDirectories 要求目标路径必须是目录(Path 末尾不带扩展名或显式表示为目录)。如果路径指向一个已存在的普通文件,会抛出 FileAlreadyExistsException。
建议做法:
- 用
Paths.get("a/b/c")构造路径,不以/或\结尾也完全合法 - 若不确定路径是否被误建为文件,可先检查:
Files.isDirectory(path) - 必要时主动删除冲突文件再创建(谨慎使用)
合理处理 IOException 和 SecurityException
常见异常包括权限不足、磁盘满、父路径被占用等。不要直接捕获 Exception,应聚焦具体问题:
立即学习“Java免费学习笔记(深入)”;
-
IOException:底层 I/O 失败(如只读文件系统),通常需记录并提示用户 -
SecurityException:安全管理器拒绝访问,多见于受限环境(如 Applet),一般应中止操作 -
FileAlreadyExistsException:路径已存在且不是目录 → 检查是否误存为文件
示例片段:
try {
Files.createDirectories(path);
} catch (FileAlreadyExistsException e) {
if (!Files.isDirectory(path)) {
throw new IllegalStateException("Path exists but is not a directory: " + path, e);
}
} catch (IOException e) {
throw new RuntimeException("Failed to create directories: " + path, e);
}
配合 Paths.get 灵活构造路径,支持变量与相对路径
Files.createDirectories 接收 Path,推荐用 Paths.get() 构造,天然支持跨平台分隔符和变量拼接:
-
Paths.get("logs", "2024", "06", "error")→ 自动拼成logs/2024/06/error(Linux/macOS)或logs\2024\06\error(Windows) - 支持
System.getProperty("user.home")等动态值:Paths.get(System.getProperty("user.home"), "myapp", "cache") - 相对路径(如
"./data/output")会被解析为相对于 JVM 启动目录
不需要预先检查目录是否存在
createDirectories 是幂等操作:若所有目录已存在,它什么也不做,直接返回原 Path。因此无需写 if (!Files.exists(path)) Files.createDirectories(path); 这类冗余判断。
唯一例外是想区分“本次创建”和“原本就存在”,此时可自行检查 Files.exists(path),但多数场景没必要。


















