`java.io.File` 是 Java 操作文件系統的入口類,**注意:它只代表路徑抽象,不保證物理文件存在**。本文通過代碼實驗,徹底釐清 `mkdir()`、`mkdirs()`、`createNewFile()` 的行為差異與使用場景。
| 方法 | 功能 | 返回值 | 拋出異常 | 典型場景 |
|---|---|---|---|---|
mkdir() | 創建**單級**目錄 | boolean:成功 true,失敗/已存在 false | SecurityException | 父目錄確定存在時創建子目錄 |
mkdirs() | 創建**多級**目錄(含父目錄) | boolean:至少一級創建成功 true | SecurityException | 路徑可能多級不存在,一鍵建齊 |
createNewFile() | 創建**空文件**(父目錄必須存在) | boolean:創建成功 true,已存在 false | IOException、SecurityException | 寫入數據前確保文件存在 |
public class FileCreateDemo {
public static void main(String[] args) throws IOException {
// 1. 多級目錄:F:/AAA/BBB/CCC (AAA/BBB 可能不存在)
File dirs = new File("F:/AAA/BBB/CCC");
if (dirs.mkdirs()) {
System.out.println("多級目錄創建成功:" + dirs.getPath());
System.out.println("父目錄:" + dirs.getParent());
}
// 2. 單級目錄:在上一步建好的 CCC 下創建 DDD
File single = new File("F:/AAA/BBB/CCC/DDD");
if (single.mkdir()) { // 父目錄 CCC 已存在,mkdir 成功
System.out.println("單級目錄創建成功:" + single.getPath());
}
// 3. 多級目錄下創建文件
File file = new File("F:/AAA/BBB/CCC/DDD", "mytest.txt");
if (file.createNewFile()) { // 父目錄 DDD 必須存在
System.out.println("文件創建成功:" + file.getAbsolutePath());
System.out.println("父目錄:" + file.getParent());
}
}
}
多級目錄創建成功:F:\AAA\BBB\CCC 父目錄:F:\AAA\BBB 單級目錄創建成功:F:\AAA\BBB\CCC\DDD 文件創建成功:F:\AAA\BBB\CCC\DDD\mytest.txt 父目錄:F:\AAA\BBB\CCC\DDD
Path path = Paths.get("F:/AAA/BBB/CCC");
Files.createDirectories(path); // 等同 mkdirs,支援屬性、異常細分
Files.createFile(path.resolve("mytest.txt")); // 原子創建,拋 FileAlreadyExistsException
建議:新專案優先使用 `java.nio.file.Files`,異常語義更豐富、支援符號鏈接、流式操作。
搞清「單級/多級、目錄/文件、父目錄前置條件」三組對應關係,`File` 創建操作即可零失誤。記住:**mkdirs = 遞歸建目錄、mkdir = 單級建目錄、createNewFile = 建文件(父目錄必備)**。