在 Java 7 之前,寫入字串到檔案需要:FileOutputStream → OutputStreamWriter → BufferedWriter → write → close,還得手動處理異常與資源關閉。Java 7 引入 **NIO.2 Files 工具類**,配合 Java 8 try-with-resources 與 Java 11 Files.writeString,讓檔案寫入化繁為簡。
| 版本 | 方法 | 特點 |
|---|---|---|
| Java 7+ | Files.write(Path, byte[], OpenOption...) | 位元組陣列,需手動 getBytes(),支援 StandardOpenOption.APPEND |
| Java 8+ | Files.write(Path, Iterable<CharSequence>, ...) | 直接寫入字串集合,自動換行 |
| Java 11+ | Files.writeString(Path, CharSequence, OpenOption...) | 最簡潔:單行字串直接寫入,預設 UTF-8,自動建立目錄/檔案 |
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class StringToFile {
public static void main(String[] args) throws IOException {
String msg = "Hello, 現代 Java NIO!\n第二行內容。";
// 一行搞定:自動建立檔案、UTF-8 編碼、寫入、關閉
Files.writeString(Paths.get("./duke.txt"), msg);
System.out.println("寫入完成");
}
}
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.io.IOException;
public class AdvancedWrite {
public static void main(String[] args) throws IOException {
Path path = Paths.get("log.txt");
// 1. 追加模式(預設覆蓋)
Files.writeString(path, "第一行\n", StandardOpenOption.CREATE, StandardOpenOption.APPEND);
Files.writeString(path, "第二行\n", StandardOpenOption.APPEND);
// 2. 指定編碼(預設 UTF-8)
Files.writeString(path, "Big5 編碼測試", StandardCharsets.ISO_8859_1); // 實際用 Big5 需 Charset.forName("Big5")
// 3. 批次寫入多行(Java 8+)
Files.write(path, List.of("行1", "行2", "行3"), StandardCharsets.UTF_8, StandardOpenOption.CREATE);
// 4. 原子寫入:先寫暫存檔,再 atomicMove 替換(防止部分寫入被讀取)
Path tmp = Files.createTempFile("atomic-", ".tmp");
Files.writeString(tmp, "完整內容");
Files.move(tmp, path, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING);
}
}
| 選項 | 效果 |
|---|---|
CREATE | 檔案不存在則建立 |
CREATE_NEW | 檔案不存在則建立,**存在則拋異常** |
TRUNCATE_EXISTING | 截斷現有檔案(預設行為) |
APPEND | 追加到檔案末尾 |
SYNC | 同步寫入磁碟(效能較慢,資料更安全) |
DSYNC | 同步資料部分(不含中繼資料) |
// 相對路徑(相對於 user.dir)
Paths.get("data/output.txt")
// 絕對路徑
Paths.get("/var/log/app.log") // Linux/macOS
Paths.get("C:/logs/app.log") // Windows (正斜線通用)
// 跨平台家目錄
Paths.get(System.getProperty("user.home"), "documents", "notes.txt")
// 建立多層目錄
Files.createDirectories(Paths.get("a/b/c")); // 不拋異常若已存在
writeString、Files.write 預設皆為 UTF-8,跨平台一致。StandardCharsets.ISO_8859_1 或 Charset.forName("Big5")。Charset.defaultCharset(),生產碼必須顯式聲明。writeString 一次性寫入最簡潔高效。Files.newBufferedWriter() 獲取 BufferedWriter 分塊寫入,避免記憶體壓力。Files.writeString(path, str):一行碼、UTF-8、自動資源管理。Files.write(path, bytes, options) 或 Files.write(path, lines, charset, options)。StandardOpenOption 組合控制建立、追加、截斷、同步行為。BufferedWriter 串流寫入。現代化原則:能用
Files別用Stream;能用writeString別手拼getBytes();能用Path別用File。NIO.2 是 Java 檔案操作的現在與未來。