374. Java IO API - 创建与读取目录
在 Java NIO 中,Files 和 Paths 提供了强大的工具来创建目录、列出目录内容和管理文件系统的根目录。本节将从实际应用角度,带你掌握这些 API 的使用方式。
🌐 列出文件系统的根目录
你可以通过 FileSystems.getDefault().getRootDirectories() 列出当前文件系统的所有根目录。这在 Windows 中通常是多个盘符(如 C:\、D:\),在 Linux/Unix 下通常是 /。
✅ 示例代码:
import java.nio.file.*;
public class ListRootDirs {
public static void main(String[] args) {
Iterable<Path> dirs = FileSystems.getDefault().getRootDirectories();
for (Path name : dirs) {
System.out.println("Root directory: " + name);
}
}
}
🛠️ 创建目录
你可以使用 Files.createDirectory() 创建一个新目录。该方法不会自动创建父目录,如果父目录不存在,则会抛出异常。
✅ 示例代码(使用默认权限):
import java.nio.file.*;
public class CreateDirectoryExample {
public static void main(String[] args) throws Exception {
Path dir = Paths.get("newFolder");
Files.createDirectory(dir);
System.out.println("Directory created: " + dir.toAbsolutePath());
}
}
🔒 在 POSIX 文件系统中设置目录权限
如果你运行在 Linux/Unix 上,并希望设置权限,比如 rwxr-x---,可以使用 PosixFilePermissions:
✅ 示例代码(带权限创建):
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.util.*;
public class CreateDirectoryWithPerms {
public static void main(String[] args) throws Exception {
Path file = Paths.get("secureFolder");
Set<PosixFilePermission> perms =
PosixFilePermissions.fromString("rwxr-x---");
FileAttribute<Set<PosixFilePermission>> attr =
PosixFilePermissions.asFileAttribute(perms);
Files.createDirectory(file, attr);
System.out.println("Secure directory created: " + file);
}
}
⚠️ 注意:Windows 不支持 POSIX 权限,运行以上代码将抛出异常。
📂 创建多级目录
有时你想要一次性创建一个目录树,如 foo/bar/test。使用 Files.createDirectories(),可以自动创建中间不存在的父目录。
✅ 示例代码:
import java.nio.file.*;
public class CreateDirectoriesExample {
public static void main(String[] args) throws Exception {
Path path = Paths.get("foo/bar/test");
Files.createDirectories(path);
System.out.println("Nested directories created: " + path.toAbsolutePath());
}
}
🧠 小贴士:即使某些目录已存在,该方法也能安全运行而不会抛出异常。
🧪 创建临时目录
你可以使用 Files.createTempDirectory() 创建临时目录,这通常用于测试或临时存储文件。
✅ 示例 1:在系统默认的临时目录中创建
import java.nio.file.*;
public class TempDirExample {
public static void main(String[] args) throws Exception {
Path tempDir = Files.createTempDirectory("myapp-");
System.out.println("Temporary directory created: " + tempDir);
}
}
✅ 示例 2:在指定位置创建临时目录
import java.nio.file.*;
public class TempDirInCustomLocation {
public static void main(String[] args) throws Exception {
Path customLocation = Paths.get("tempArea");
Files.createDirectories(customLocation); // 确保父目录存在
Path tempDir = Files.createTempDirectory(customLocation, "session-");
System.out.println("Temporary directory created: " + tempDir);
}
}
⚠️ 注意:记得清理临时目录,避免资源泄漏。
🎯 总结与最佳实践
| 任务 | 使用方法 | 备注 |
|---|---|---|
| 列出根目录 | FileSystems.getDefault().getRootDirectories() | 遍历系统的根路径 |
| 创建目录(单层) | Files.createDirectory() | 父目录必须存在 |
| 创建多级目录 | Files.createDirectories() | 自动创建所有不存在的父目录 |
| 创建临时目录 | Files.createTempDirectory() | 用于临时工作目录,可指定前缀与位置 |
| 创建目录并设置权限 | PosixFilePermissions | 仅在 POSIX 系统有效(Linux/Unix) |