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 方法。