1. 導言
在程式設計中幾乎一定會與檔案打交道。大家都熟悉的例子:儲存記事文字、遊戲進度、複製圖片,或從設定檔讀取配置。
在 Java 中有現代又好用的工具:Path 和 Files,位於套件 java.nio.file。它們讓你用幾行程式就能開啟檔案、讀取內容、寫入文字,甚至複製圖片。
檔案路徑 (Path)
檔案一定存在於某個磁碟位置,若要存取它,就必須指定路徑。為此 Java 提供 Path 類別,而建立新物件可以使用方法 Path.of()。
Path path = Path.of("hello.txt"); // 相對路徑
Path absPath = Path.of("C:/Users/Me/image.png"); // 絕對路徑 (Windows)
說明:
- 相對路徑會在目前的專案資料夾中尋找檔案(例如 "hello.txt")。
- 絕對路徑則是完整位址:磁碟、資料夾與檔名。
2. 處理文字檔案
在 Java 的觀點中,檔案大致分為兩類 — 文字與二進位。若內容可以表達成人類可讀的文字,就是文字檔;其餘情況則是純粹的位元組集合(也就是二進位檔)。
將文字寫入檔案 — writeString
要把字串寫入檔案,可使用方法 writeString。
Path p = Path.of("hello.txt");
Files.writeString(p, "你好,檔案!");
這裡發生了什麼:
- 建立一個 Path 物件,指向 "hello.txt";
- 用 writeString 方法將字串寫入;
- 若檔案不存在,會自動建立。
如此便能輕鬆把記事或訊息存成文字檔。
從檔案讀取文字 — readString
方法 readString 可以一次將整個檔案讀入為一個字串。
Path p = Path.of("hello.txt");
String content = Files.readString(p);
System.out.println(content);
現在在變數 content 中存放的是檔案內容。這對小型檔案很方便:設定檔、文字、JSON 文件。
3. 處理二進位檔案
並非所有檔案都是文字。圖片、音樂、壓縮檔 — 這些是位元組的集合。要處理它們可以使用 write 和 readAllBytes 方法。
將位元組寫入檔案 — write
方法 write() 可以把位元組陣列寫入檔案。它也常被稱為緩衝區(byte buffer)。
byte[] data = {65, 66, 67, 68}; // 字元 A B C D
Files.write(Path.of("letters.bin"), data);
這裡我們將位元組陣列寫入檔案。若以文字方式開啟,裡面會是字母 "ABCD"。
讀取位元組 — readAllBytes
要把檔案內容讀回成位元組陣列,可使用方法 readAllBytes。
byte[] buffer = Files.readAllBytes(Path.of("letters.bin"));
// 將讀到的位元組陣列輸出到螢幕
for (byte b : buffer)
{
System.out.print((char)b + " ");
}
畫面上會輸出:
A B C D
這種方式可用於各種二進位檔案 — 圖片、文件、音樂等。
4. 常見的檔案操作情境
最常見的檔案操作,大概就是複製檔案了。
複製檔案
要複製檔案,可以先把它讀成位元組陣列,再寫入到另一個檔案。
Path in = Path.of("logo.png");
Path out = Path.of("logo_copy.png");
byte[] bytes = Files.readAllBytes(in);
Files.write(out, bytes);
透過這個方法,你可以不必在意格式,直接複製圖片、文件或任何其他檔案。
檢查存在與大小
有時需要確認檔案是否存在,並取得它的大小。為此可以使用 exists 與 size 方法。
Path p = Path.of("hello.txt");
if (Files.exists(p))
{
long size = Files.size(p);
System.out.println("找到檔案,大小: " + size + " 位元組");
}
else
{
System.out.println("找不到檔案!");
}
這對除錯很有幫助:你能確定自己是否在操作正確的檔案。
5. 例外狀況
檔案操作可能會失敗:檔案不存在、沒有存取權限、磁碟已滿或檔案被其他程式占用。因此,應將對磁碟的操作包在 try-catch 中,或用 throws 將例外往外拋。
try
{
String content = Files.readString(Path.of("hello.txt"));
System.out.println(content);
}
catch (IOException e)
{
System.out.println("讀取時發生錯誤: " + e.getMessage());
}
如此一來,程式不會直接「當掉」,而是能友善地告訴使用者發生了什麼。如果需要,也可以在方法上使用 throws,把 IOException 沿著呼叫堆疊往外拋。
GO TO FULL VERSION