mkdir只能创建单层目录且要求父目录必须存在,mkdirs可递归创建多级目录并自动补全缺失的父目录,二者均不抛异常而仅返回boolean值。

mkdir 只能建一层,mkdirs 能建多层——这是最核心的区别。选错方法,目录就创建失败,但程序不会报错,只默默返回 false。
mkdir:父目录必须存在
调用 mkdir() 时,它只负责创建路径中最后一级目录。前面所有上级目录都得提前准备好。
- 比如想创建
"logs/2024/06/15",用new File("logs/2024/06/15").mkdir(),前提是"logs/2024/06"已存在;否则返回 false - 即使路径本身合法、磁盘有写权限,只要缺一级父目录,就失败
- 它不抛异常,也不提示原因,容易误判为“权限问题”或“路径写错了”
mkdirs:自动补全整个路径链
mkdirs() 会从根开始逐级检查,缺失哪一级就建哪一级,直到目标目录成功落地。
- 同样创建
"logs/2024/06/15",用mkdirs()就能一口气建出 logs → 2024 → 06 → 15 全部目录 - 适合动态路径场景,比如按日期生成日志目录:
"logs/" + yyyy + "/" + MM + "/" + dd - 注意:多线程并发调用同一路径时,可能有竞态——两个线程同时执行
mkdirs(),其中一个会失败(返回 false),不是 bug,是正常行为
实际写法建议
绝大多数情况下,优先用 mkdirs();只有明确知道父目录一定存在、且只需建一层时,才考虑 mkdir()。
- 创建文件前,先确保其父目录存在:获取
file.getParentFile().mkdirs(),再file.createNewFile() - 路径含中文或空格?确保字符串编码为 UTF-8,避免在 Windows 等平台解析失败
- 别依赖返回值判断“是否新建”,因为目录已存在时两者都返回 false;如需确认是否真正新建,应结合
exists()和创建前状态判断
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











