HOWTO · Java
在 Java 中建立目錄
本教程討論如何在 Java 中建立目錄
本頁內容
目錄是檔案系統中用來收納檔案的編目結構,建立目錄是 Java 中常見的檔案處理工作。JDK 提供兩組 API——舊的 java.io.File 方法與較新的 java.nio.file.Files 輔助方法——Apache Commons IO 則提供第三種選擇。本教學會示範每種做法,以及選擇時需要注意的行為差異。
選擇 Java 目錄建立方法
大多數新程式碼建議優先使用 java.nio.file.Files。當部分父目錄可能尚未存在時,呼叫 Files.createDirectories(path):它會在一次呼叫中建立整條路徑,且不會只因為目錄已存在就失敗。如果目標已存在應視為失敗,則改用 Files.createDirectory(path)。較舊的 File.mkdir() 與 File.mkdirs() 只透過 boolean 回報成功與否,很容易被忽略;Files 方法則會拋出指明確切問題的受檢例外。FileUtils.forceMkdir() 只適合已經依賴 Apache Commons IO 的程式碼庫。
各方法處理缺少的父目錄與已存在目標的方式,是重要的差異:
| 方法 | 缺少父目錄 | 目標目錄已存在 | 失敗訊號 |
|---|---|---|---|
File.mkdir() |
失敗並回傳 false |
回傳 false |
boolean 回傳值 |
File.mkdirs() |
會建立父目錄 | 回傳 false |
boolean 回傳值 |
Files.createDirectory() |
NoSuchFileException |
FileAlreadyExistsException |
受檢 IOException 子類型 |
Files.createDirectories() |
會建立父目錄 | 正常回傳 | 受檢 IOException 子類型 |
FileUtils.forceMkdir() |
會建立父目錄 | 正常回傳 | IOException |
使用 File.mkdir() 建立單一目錄
File.mkdir() 會在 File 實例所持有的路徑上建立剛好一個目錄。只有實際建立目錄時才回傳 true;當名稱已被佔用、父目錄不存在,或作業系統拒絕請求時則回傳 false,因此務必檢查回傳值,不要假設一定成功。
以下程式會在工作目錄中建立一個名為 reports 的目錄,並印出結果:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import java.io.File;
public class MkdirExample {
public static void main(String[] args) {
File dir = new File("reports");
boolean created = dir.mkdir();
System.out.println("mkdir() returned: " + created);
System.out.println("Directory exists: " + dir.isDirectory());
}
}
mkdir() returned: true
Directory exists: true
回傳 false 時無法得知原因——如果先前就存在的目錄可以接受,事後可檢查 dir.isDirectory();若需要型別化的失敗資訊,請改用 Files.createDirectory()。當安全管理器拒絕寫入權限時,mkdir() 也可能拋出非受檢的 SecurityException。
使用 File.mkdirs() 建立目錄樹
File.mkdirs() 會在單次呼叫中建立目標目錄以及路徑上所有缺少的父目錄:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import java.io.File;
public class MkdirsExample {
public static void main(String[] args) {
File dir = new File("reports/2026/october");
boolean created = dir.mkdirs();
System.out.println("mkdirs() returned: " + created);
System.out.println("Directory exists: " + dir.isDirectory());
}
}
mkdirs() returned: true
Directory exists: true
請注意,mkdirs() 只有在建立了目錄及所有必要的父目錄時才回傳 true。對已存在的目錄樹執行時會回傳 false,即使沒有任何錯誤;而且 false 結果不會指出是哪一層失敗。當「成功」只是指目錄存在時,請用 isDirectory() 驗證。
使用 Files.createDirectory() 建立單一目錄
Files.createDirectory(path) 是 mkdir() 的 NIO 對應方法:它只建立一個目錄,父目錄不存在時會失敗。由於其失敗以受檢例外表示,編譯器會強制你處理,而且例外型別能指出問題——名稱被佔用時是 FileAlreadyExistsException,父目錄缺少時是 NoSuchFileException。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class CreateDirectoryExample {
public static void main(String[] args) {
Path path = Paths.get("logs");
try {
Files.createDirectory(path);
System.out.println("Created directory: " + path);
} catch (FileAlreadyExistsException e) {
System.out.println("Already exists: " + path);
} catch (IOException e) {
System.out.println("Could not create directory: " + e);
}
}
}
Created directory: logs
單獨捕捉 FileAlreadyExistsException 可讓常見的「已經存在」情況安靜通過,而其他 IOException 子類型仍會浮現為失敗。
使用 Files.createDirectories() 建立目錄樹
Files.createDirectories(path) 會在一次呼叫中建立目標及所有缺少的父目錄;與 mkdirs() 不同的是,目錄已存在時它會正常回傳——當你只是需要該路徑存在時,這是建議的呼叫方式。若路徑被一般檔案佔用,它仍會拋出 FileAlreadyExistsException;遇到權限被拒等真正的失敗時,則拋出其他 IOException 子類型。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class CreateDirectoriesExample {
public static void main(String[] args) {
Path path = Paths.get("data/archive/2026");
try {
Files.createDirectories(path);
System.out.println("Directory ready: " + path);
} catch (IOException e) {
System.out.println("Could not create directory: " + e);
}
}
}
Directory ready: data/archive/2026
使用 Apache Commons IO 的 FileUtils.forceMkdir()
FileUtils.forceMkdir() 不屬於 JDK;它位於 Apache Commons IO 中,因此專案需要 commons-io 相依性(例如 Maven 或 Gradle 中的 commons-io:commons-io 構件)。由於該程式庫不在標準 classpath 上,以下以行內程式碼呈現此呼叫,而非可執行範例:
FileUtils.forceMkdir(new File("data/archive/2026"));
與 createDirectories() 相同,它會建立目錄及所有缺少的父目錄,並在目錄已存在時靜默回傳——儘管名稱中有「force」,它指的是建立所需的父目錄,而非覆寫任何東西。當路徑被非目錄檔案佔用或目錄無法建立時,它會拋出 IOException。除非程式碼庫已使用 Commons IO,否則建議優先使用標準的 Files 方法。