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);
}
提示:
檢查是否存在並不能防止執行緒之間的競爭條件,但對多數使用情境而言,已經足夠實用。
簡述:建立檔案時會發生什麼?
- 若檔案不存在且路徑有效——會建立一個新的空檔。
- 若檔案已存在——會丟出例外。
- 若路徑不正確、沒有權限或資料夾不存在——會丟出其他例外(IOException、NoSuchFileException 等)。
2. 建立目錄
Files.createDirectory 與 Files.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,而父層仍不存在——會發生錯誤。
表格:建立資料夾方法比較
| 方法 | 只建立單一資料夾 | 可建立巢狀資料夾 | 若部分已存在不會失敗 |
|---|---|---|---|
|
✔ | ✗ | ✗ |
|
✔ | ✔ | ✔ |
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.createFile 與 Files.createDirectory 在目標已存在時會拋出例外。解法——事先檢查是否存在,或直接捕捉例外。
錯誤 2:使用 createDirectory 建立巢狀資料夾,但父層尚未存在。 這種情況會拋出 NoSuchFileException。請使用 createDirectories 建立整串資料夾。
錯誤 3:嘗試用 Files.delete 刪除非空資料夾。 會得到 DirectoryNotEmptyException。刪除非空目錄需要遞迴。
錯誤 4:在指定目錄沒有建立/刪除的權限。 會拋出 AccessDeniedException 或 IOException。請以需要的權限執行程式,或使用可存取的資料夾。
錯誤 5:檔案被其他程序占用。 在 Windows(有時也包含其他作業系統)上,如果檔案在其他程式中開啟,無法刪除。會得到 IOException。請在刪除前關閉所有使用該檔案的應用程式。
錯誤 6:在不清楚「你目前所在位置」的情況下使用相對路徑。 檔案被建立在非預期的位置。為求保險,使用 toAbsolutePath() 並將路徑輸出到畫面。
GO TO FULL VERSION