Java I/O 體系龐大,寫入檔案的方式不下十種。本文精選四種最常見、最具代表性的寫法:FileWriter、BufferedWriter、FileOutputStream(傳統與 Try-with-resources)、Files.write() (NIO.2),並從適用場景、效能、資源管理、編碼控制等維度深度比較,助你根據專案需求選擇最佳方案。
File file = new File("demo.txt");
try (FileWriter fw = new FileWriter(file)) { // 預設覆寫
fw.write("Hello World");
} catch (IOException e) {
e.printStackTrace();
}
// 第二個參數 true 表示 append
try (FileWriter fw = new FileWriter(file, true)) {
fw.write("\nAppend line");
}
try (FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw)) {
bw.write("Line 1");
bw.newLine(); // 跨平台換行
bw.write("Line 2");
} catch (IOException e) {
e.printStackTrace();
}
newLine() 自動處理 \r\n / \n 差異。FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
byte[] data = "內容".getBytes("UTF-8"); // 明確指定編碼
fos.write(data);
fos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) try { fos.close(); } catch (IOException ignored) {}
}
try (FileOutputStream fos = new FileOutputStream(file)) {
fos.write("內容".getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
e.printStackTrace();
}
StandardCharsets.UTF_8),跨平台最穩定。import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
List<String> lines = Arrays.asList("Line 1", "Line 2", "Line 3");
Files.write(Paths.get("nio.txt"), lines, StandardCharsets.UTF_8,
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
// 附加模式:StandardOpenOption.APPEND
StandardOpenOption 組合:APPEND, SYNC, DSYNC 等。List<String>、byte[]、Iterable<Byte>,不支援串流式寫入超大檔案(需搭配 Files.newBufferedWriter)。| 方式 | 耗時 (ms) | 備註 |
|---|---|---|
| FileWriter | ~1,200 | 無緩衝,頻繁系統呼叫 |
| BufferedWriter | ~180 | 8KB 緩衝 |
| FileOutputStream + byte[] | ~150 | 單次寫入 |
| Files.write() | ~160 | 內部緩衝 + 原子選項 |
環境:SSD、JDK 17、Windows 11,僅供相對參考。
Files.write(..., StandardCharsets.UTF_8, ...)。Files.newBufferedWriter(path, StandardCharsets.UTF_8) 取得 BufferedWriter 逐行寫入。Files.copy(inputStream, path, StandardCopyOption.REPLACE_EXISTING) 或 FileOutputStream。FileChannel.lock() 或資料庫協調),單純 Java I/O 無法保證原子性。StandardCharsets.UTF_8,杜絕平台預設編碼。FileWriter(file, true) 附加模式下,若檔案不存在會自動建立;但目錄不存在會拋 FileNotFoundException,需先 file.getParentFile().mkdirs()。Files.write 預設 CREATE, TRUNCATE_EXISTING, WRITE,若需保留舊內容必須加 APPEND。Files.write(..., SYNC) 會強制刷入實體磁碟,效能大幅下降,非關鍵資料勿用。