java.io.File
这是最传统、最基础的方法,适用于 Java 7 及以上版本。

创建单级目录
使用 File 对象的 mkdir() 方法,如果父目录不存在,创建会失败。
import java.io.File;
public class CreateSingleDir {
public static void main(String[] args) {
// 定义要创建的目录路径
String dirPath = "/tmp/my_new_folder";
File directory = new File(dirPath);
// 检查目录是否已存在
if (directory.exists()) {
System.out.println("目录已存在: " + dirPath);
} else {
// 尝试创建目录
boolean isCreated = directory.mkdir();
if (isCreated) {
System.out.println("目录创建成功: " + dirPath);
} else {
System.out.println("目录创建失败: " + dirPath);
}
}
}
}
注意:
mkdir()只能创建一级目录。/tmp不存在,它无法创建/tmp/my_new_folder。- 在 Linux 中,路径分隔符是 ,虽然 Java 在 Windows 上也能运行,但为了更好的跨平台性,推荐使用
File.separator。
创建多级目录(递归创建)
使用 File 对象的 mkdirs() 方法,如果父目录不存在,它会一并创建,这是创建目录时最常用的方法。
import java.io.File;
public class CreateMultiDir {
public static void main(String[] args) {
// 定义要创建的多级目录路径
String dirPath = "/tmp/a/b/c/d";
File directory = new File(dirPath);
// 检查目录是否已存在
if (directory.exists()) {
System.out.println("目录已存在: " + dirPath);
} else {
// 尝试创建多级目录
boolean isCreated = directory.mkdirs();
if (isCreated) {
System.out.println("多级目录创建成功: " + dirPath);
} else {
System.out.println("多级目录创建失败: " + dirPath);
}
}
}
}
现代方法:java.nio.file (Java 7+)
从 Java 7 开始,引入了新的 java.nio.file (New I/O) 包,它提供了更强大、更灵活的文件系统操作。这是目前推荐的方式。

创建单级目录
使用 Files.createDirectory(),如果目录已存在或父目录不存在,它会抛出异常。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class CreateSingleDirNIO {
public static void main(String[] args) {
String dirPath = "/tmp/nio_single_folder";
Path path = Paths.get(dirPath);
try {
// 如果目录不存在,则创建它
if (!Files.exists(path)) {
// createDirectory 会创建单级目录
Path newPath = Files.createDirectory(path);
System.out.println("目录创建成功: " + newPath);
} else {
System.out.println("目录已存在: " + dirPath);
}
} catch (IOException e) {
System.err.println("创建目录时出错: " + e.getMessage());
e.printStackTrace();
}
}
}
创建多级目录(递归创建)
使用 Files.createDirectories(),这是 mkdirs() 的直接替代品,并且更符合 Java 的异常处理模型。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class CreateMultiDirNIO {
public static void main(String[] args) {
String dirPath = "/tmp/nio/a/b/c/d";
Path path = Paths.get(dirPath);
try {
// createDirectories 会递归创建所有不存在的父目录
// 如果目录已存在,它不会抛出异常,而是静默返回
Path newPath = Files.createDirectories(path);
System.out.println("多级目录创建成功: " + newPath);
} catch (IOException e) {
System.err.println("创建多级目录时出错: " + e.getMessage());
e.printStackTrace();
}
}
}
高级主题和最佳实践
权限问题
在 Linux 中,创建目录的权限由 umask 和文件系统权限共同决定。
File方法的默认权限:mkdir()和mkdirs()创建的目录默认权限是755(所有者可读/写/执行,组和其他用户可读/执行),但会受到系统umask值的影响。Files方法的默认权限:Files.createDirectory()和Files.createDirectories()创建的目录默认权限是755(同样受umask 影响)。
如何指定特定权限?

Files.createDirectories() 的一个重载方法允许你指定权限集合。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.HashSet;
import java.util.Set;
public class CreateDirWithPermissions {
public static void main(String[] args) {
String dirPath = "/tmp/secure_folder";
Path path = Paths.get(dirPath);
// 定义权限: 所有者 rwx, 组 r-x, 其他 ---
// 7 (rwx) 5 (r-x) 0 (---)
String permissions = "rwxr-x---";
try {
// 将权限字符串转换为 FileAttribute
Set<PosixFilePermission> perms = PosixFilePermissions.fromString(permissions);
FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);
// 创建目录并设置权限
Path newPath = Files.createDirectories(path, attr);
System.out.println("目录创建成功,权限为 " + permissions + ": " + newPath);
} catch (IOException e) {
System.err.println("创建目录时出错: " + e.getMessage());
e.printStackTrace();
}
}
}
注意:PosixFilePermission 是特定于 POSIX 系统(如 Linux, macOS)的,在 Windows 上不可用。
跨平台路径处理
为了避免在 Windows (\) 和 Linux () 上出现路径问题,最佳实践是:
- 使用
Paths.get(String, String...)来构建路径。 - 使用
File.separator或直接使用 (Java 的File类内部会自动处理)。
推荐做法 (NIO):
// 这种方式在任何操作系统上都能正常工作
Path path = Paths.get(System.getProperty("user.home"), "my_app", "data");
异常处理
文件操作是 I/O 操作,可能会因为各种原因失败(如权限不足、磁盘已满、路径无效等)。始终使用 try-catch 块来处理 IOException。
总结与推荐
| 特性 | java.io.File.mkdir() / mkdirs() |
java.nio.file.Files.createDirectory() / createDirectories() |
|---|---|---|
| Java 版本 | 1+ | 7+ (推荐) |
| 创建单级目录 | mkdir() |
Files.createDirectory() |
| 创建多级目录 | mkdirs() |
Files.createDirectories() (首选) |
| 返回值 | boolean (成功/失败) |
Path (新创建的路径) |
| 错误处理 | 返回 false,不提供详细错误信息 |
抛出 IOException,信息更丰富 |
| 权限控制 | 有限 | 强大,支持 FileAttribute |
| 现代性 | 已被视为遗留 API | 现代、功能更丰富的 API |
最终建议:
- 如果你使用的是 Java 7 或更高版本,请优先使用
java.nio.file.Files包。 - 在绝大多数情况下,使用
Files.createDirectories(path)是最简单、最健壮的创建目录的方式。 - 始终将文件 I/O 操作放在
try-catch块中。 - 为了代码的可移植性,使用
Paths.get()来构建路径。
