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


原始标题:Create a Directory in Java