1. 概述
在 Java 中创建目录其实挺简单直接的,JDK 提供了两个方法来满足不同场景的需求:
mkdir()
:用于创建单个目录mkdirs()
:用于创建嵌套的多级目录
这篇文章我们就来聊聊这两个方法的具体行为和使用技巧。
2. 创建单个目录
我们先从最简单的开始:创建一个单独的目录。
为了演示方便,我们使用系统的临时目录(temp dir)作为父目录。可以通过以下方式获取:
private static final File TEMP_DIRECTORY = new File(System.getProperty("java.io.tmpdir"));
接着我们在这个目录下创建一个新的子目录。通过构造一个新的 File
对象并调用其 mkdir()
方法即可实现:
File newDirectory = new File(TEMP_DIRECTORY, "new_directory");
assertFalse(newDirectory.exists());
assertTrue(newDirectory.mkdir());
这里我们先检查目标目录是否已存在(exists()
),再调用 mkdir()
创建它。如果创建成功,该方法返回 true
;如果目录已经存在或者创建失败,则返回 false
。
再次执行相同的代码:
assertTrue(newDirectory.exists());
assertFalse(newDirectory.mkdir());
不出所料,第二次调用返回了 false
。
⚠️ 注意:**mkdir()
不仅在目录已存在时返回 false
,在其他异常情况下也会返回 false
**。例如:
- 同名文件已经存在
- 当前进程没有权限创建目录
因此,如果你只是想确保目录存在,而不关心是不是你刚创建的,可以这样写:
newDirectory.mkdir() || newDirectory.isDirectory()
✅ 这样无论目录是新创建的还是本来就存在的,都能保证最终它是存在的。
3. 创建多层嵌套目录
上面的方法只能创建一层目录。那如果我们需要创建类似 a/b/c
这样的嵌套结构呢?
来看个例子,如果我们直接对深层目录调用 mkdir()
:
File newDirectory = new File(TEMP_DIRECTORY, "new_directory");
File nestedDirectory = new File(newDirectory, "nested_directory");
assertFalse(newDirectory.exists());
assertFalse(nestedDirectory.exists());
assertFalse(nestedDirectory.mkdir());
你会发现,由于 new_directory
不存在,nested_directory
并不会被创建成功,返回 false
。
这时候就要请出另一个神器:**mkdirs()
方法!**
这个方法会像 mkdir()
一样尝试创建当前目录,并且还会自动创建所有不存在的父目录。
修改一下上面的例子:
File newDirectory = new File(System.getProperty("java.io.tmpdir") + File.separator + "new_directory");
File nestedDirectory = new File(newDirectory, "nested_directory");
assertFalse(newDirectory.exists());
assertFalse(nestedDirectory.exists());
assertTrue(nestedDirectory.mkdirs());
✅ 成功创建了整个路径!
💡 小贴士:
- 使用
File(String)
构造器时,推荐使用File.separator
来拼接路径,避免跨平台问题。 mkdirs()
只有在至少创建了一个目录的情况下才会返回true
;否则返回false
。- 如果所有目录都已存在,它也返回
false
。
所以你可以理解为:**mkdirs()
是增强版的 mkdir()
,支持递归创建路径。**
4. 总结
今天我们讲了 Java 中创建目录的两种常用方式:
方法 | 功能 | 是否支持递归创建 |
---|---|---|
mkdir() |
创建单个目录 | ❌ 否 |
mkdirs() |
创建目录及其所有父目录 | ✅ 是 |
📌 实战建议:
- 如果确定父目录都存在,用
mkdir()
更轻量; - 如果不确定路径完整性,优先考虑
mkdirs()
; - 判断目录是否存在时,结合
isDirectory()
更稳妥;
本文完整代码可以在 GitHub 上找到 👉 core-java-io-2