CodeGym /課程 /JAVA 25 SELF /建立與刪除檔案與資料夾

建立與刪除檔案與資料夾

JAVA 25 SELF
等級 40 , 課堂 0
開放

1. 建立檔案

在程式中建立檔案的情況非常常見:用於日誌、暫存資料、匯出報表、匯入資料、儲存設定等等。在 Java 中,正如你可能已經猜到的,最好使用現代的 API — java.nio.file

主要工具:Files.createFile(Path)

此方法會在指定路徑建立新檔案。若該檔案已存在,會丟出例外。

範例:在目前目錄建立文字檔

import java.nio.file.*;

public class CreateFileExample {
    public static void main(String[] args) {
        Path path = Path.of("hello.txt");
        try {
            Files.createFile(path);
            System.out.println("檔案已建立: " + path.toAbsolutePath());
        } catch (FileAlreadyExistsException e) {
            System.out.println("檔案已存在: " + path);
        } catch (Exception e) {
            System.out.println("建立檔案時發生錯誤: " + e.getMessage());
        }
    }
}

注意:
Files.createFile 會在檔案已存在時丟出 FileAlreadyExistsException。因此常見做法是在建立前先檢查是否存在。

檢查檔案是否存在

Path path = Path.of("hello.txt");
if (!Files.exists(path)) {
    Files.createFile(path);
}

提示:
檢查是否存在並不能防止執行緒之間的競爭條件,但對多數使用情境而言,已經足夠實用。

簡述:建立檔案時會發生什麼?

  • 若檔案不存在且路徑有效——會建立一個新的空檔。
  • 若檔案已存在——會丟出例外。
  • 若路徑不正確、沒有權限或資料夾不存在——會丟出其他例外(IOExceptionNoSuchFileException 等)。

2. 建立目錄

Files.createDirectoryFiles.createDirectories 的差異

  • Files.createDirectory(Path) —— 只建立單一資料夾。若父層資料夾不存在——會發生錯誤。
  • Files.createDirectories(Path) —— 會建立所有缺少的整串資料夾(就像在腳下現搭一座梯子)。

範例:建立一個資料夾

Path dir = Path.of("data");
try {
    Files.createDirectory(dir);
    System.out.println("資料夾已建立: " + dir.toAbsolutePath());
} catch (FileAlreadyExistsException e) {
    System.out.println("資料夾已存在: " + dir);
} catch (Exception e) {
    System.out.println("建立資料夾時發生錯誤: " + e.getMessage());
}

範例:建立巢狀資料夾結構

Path nested = Path.of("data/reports/2024");
try {
    Files.createDirectories(nested);
    System.out.println("資料夾結構已建立: " + nested.toAbsolutePath());
} catch (Exception e) {
    System.out.println("建立結構時發生錯誤: " + e.getMessage());
}

請注意:若某些資料夾已存在,createDirectories 並不介意——它只會建立缺少的那些。若對巢狀資料夾使用 createDirectory,而父層仍不存在——會發生錯誤。

表格:建立資料夾方法比較

方法 只建立單一資料夾 可建立巢狀資料夾 若部分已存在不會失敗
createDirectory
createDirectories

3. 刪除檔案

刪除檔案就像倒垃圾:重點是別把需要的東西丟了!在 Java 中有兩個主要方法:

  • Files.delete(Path) —— 刪除檔案或空的資料夾。若目標不存在——會丟出例外。
  • Files.deleteIfExists(Path) —— 嘗試刪除檔案;若不存在——不會拋出例外,只是什麼也不做。

範例:刪除暫存檔

Path tempFile = Path.of("temp.txt");
try {
    Files.delete(tempFile);
    System.out.println("檔案已刪除: " + tempFile);
} catch (NoSuchFileException e) {
    System.out.println("找不到檔案: " + tempFile);
} catch (DirectoryNotEmptyException e) {
    System.out.println("資料夾非空: " + tempFile);
} catch (Exception e) {
    System.out.println("刪除時發生錯誤: " + e.getMessage());
}

更安全的做法

boolean deleted = Files.deleteIfExists(tempFile);
if (deleted) {
    System.out.println("檔案已被刪除。");
} else {
    System.out.println("找不到檔案——無需刪除。");
}

重要!

  • 若檔案正被其他程式開啟——可能會拋出例外(例如在 Windows 上)。
  • 若嘗試刪除非空的資料夾——會發生 DirectoryNotEmptyException

4. 刪除目錄

在 Java 中刪除資料夾與刪除檔案大致相同,但有個重點:標準方法只能刪除 空的 資料夾。

範例:刪除空資料夾

Path emptyDir = Path.of("empty_folder");
try {
    Files.delete(emptyDir);
    System.out.println("資料夾已刪除: " + emptyDir);
} catch (DirectoryNotEmptyException e) {
    System.out.println("資料夾非空: " + emptyDir);
} catch (NoSuchFileException e) {
    System.out.println("找不到資料夾: " + emptyDir);
} catch (Exception e) {
    System.out.println("刪除資料夾時發生錯誤: " + e.getMessage());
}

非空資料夾該怎麼辦?

要刪除非空目錄,需要遞迴刪除其中所有檔案與子資料夾。這是另一堂課的主題(也是一場小冒險),但如果你已經迫不及待,先給你一段程式碼,自己研究並嘗試實作:

import java.nio.file.*;
import java.io.IOException;

public class DeleteDirectoryRecursively {
    public static void deleteRecursively(Path path) throws IOException {
        if (Files.isDirectory(path)) {
            try (var entries = Files.list(path)) {
                for (Path entry : entries.toList()) {
                    deleteRecursively(entry);
                }
            }
        }
        Files.delete(path);
    }
}

注意:
此程式碼會刪除資料夾內的所有內容!請小心使用。

5. 實用建議

刪除前先檢查是否存在

if (Files.exists(path)) {
    Files.delete(path);
} else {
    System.out.println("檔案/資料夾不存在。");
}

但如果使用 deleteIfExists,就不一定需要這麼做。

處理例外

處理檔案時經常會遇到各種狀況;Java 會為此拋出不同的例外:

  • NoSuchFileException —— 找不到檔案或資料夾。例如你嘗試開啟已被刪除的東西。
  • DirectoryNotEmptyException —— 你想刪除資料夾,但裡面還有內容。
  • IOException —— 通用的警示:出現了某些問題。可能的原因包括沒有存取權限、檔案被其他程式占用、路徑不正確等。

視覺化示意:主要方法

+-------------------+         +--------------------+
| Files.createFile  | ---->   |   新檔案           |
+-------------------+         +--------------------+

+---------------------+       +--------------------+
| Files.createDirectory|----> |  新資料夾          |
+---------------------+       +--------------------+

+-------------------+         +--------------------+
| Files.delete      | ---->   |  檔案/資料夾已刪除 |
+-------------------+         +--------------------+

(但僅限於資料夾為空!)

6. 建立與刪除檔案/資料夾的常見錯誤

錯誤 1:嘗試建立已存在的檔案/資料夾。 方法 Files.createFileFiles.createDirectory 在目標已存在時會拋出例外。解法——事先檢查是否存在,或直接捕捉例外。

錯誤 2:使用 createDirectory 建立巢狀資料夾,但父層尚未存在。 這種情況會拋出 NoSuchFileException。請使用 createDirectories 建立整串資料夾。

錯誤 3:嘗試用 Files.delete 刪除非空資料夾。 會得到 DirectoryNotEmptyException。刪除非空目錄需要遞迴。

錯誤 4:在指定目錄沒有建立/刪除的權限。 會拋出 AccessDeniedExceptionIOException。請以需要的權限執行程式,或使用可存取的資料夾。

錯誤 5:檔案被其他程序占用。 在 Windows(有時也包含其他作業系統)上,如果檔案在其他程式中開啟,無法刪除。會得到 IOException。請在刪除前關閉所有使用該檔案的應用程式。

錯誤 6:在不清楚「你目前所在位置」的情況下使用相對路徑。 檔案被建立在非預期的位置。為求保險,使用 toAbsolutePath() 並將路徑輸出到畫面。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION