write() 將資料推入流緩衝區。close() 強制刷新緩衝區並釋放檔案鎖。
import java.io.*;
public class WriteFile1 {
public static void main(String[] args) {
String text = "Java語言";
int number = 100;
try (FileOutputStream fos = new FileOutputStream("e:\\out.txt")) {
// 手動轉 byte[],按協議順序寫入
fos.write(text.getBytes(StandardCharsets.UTF_8));
fos.write("\r\n".getBytes()); // Windows 換行
fos.write(String.valueOf(number).getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
e.printStackTrace();
}
}
}
檔案內容:
Java語言 100
append=true
// 覆蓋模式(預設)
new FileOutputStream("log.txt")
// 追加模式
new FileOutputStream("log.txt", true)
適用:日誌檔案、斷點續傳記錄、持久化隊列。
flush():強制將緩衝區資料寫入磁碟,流保持開啟,可繼續寫入。close():內部呼叫 flush(),再釋放檔案控制權,流不可再用。關鍵場景:關鍵日誌每行 flush() 確保不丟失;批量寫入最後統一 close()。
內建字符→位元組轉換,適合純文字檔案:
try (FileWriter fw = new FileWriter("e:\\out.txt", true)) { // 追加模式
fw.write("第一行\r\n");
fw.write("第二行\r\n");
fw.write(String.valueOf(200));
} // 自動 flush + close
字符流優勢:直接寫 String/char[],無需手動 getBytes(),編碼預設平台預設(建議顯式指定)。
// 位元組流 + 手動編碼
try (FileOutputStream fos = new FileOutputStream("data.txt")) {
fos.write("中文".getBytes(StandardCharsets.UTF_8));
}
// 字符流 + 指定編碼 (Java 11 新增建構子)
try (FileWriter fw = new FileWriter("data.txt", StandardCharsets.UTF_8)) {
fw.write("中文");
}
// 通用寫法:OutputStreamWriter 橋接
try (OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("data.txt"), StandardCharsets.UTF_8)) {
osw.write("中文");
}
所有輸出流本質相同:建立流 → 序列化為位元組/字符序列 → 寫入。自定義檔案格式範例:
// 寫入多種類型到同一檔案
try (DataOutputStream dos = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream("data.bin")))) {
dos.writeInt(2024); // 版本號
dos.writeUTF("配置檔"); // 標題
dos.writeBoolean(true); // 啟用標誌
dos.writeDouble(3.14159); // 參數
dos.writeInt(3); // 陣列長度
for (int i=1;i<=3;i++) dos.writeInt(i*10); // 陣列內容
}
| 場景 | 推薦組合 | 理由 |
|---|---|---|
| 大檔案順序寫入 | FileOutputStream + BufferedOutputStream | 減少系統呼叫,批量刷新 |
| 大文字檔寫入 | FileWriter + BufferedWriter | 字符緩衝 + 高效換行 |
| 結構化數據 | DataOutputStream + BufferedOutputStream | 類型安全 + 緩衝 |
| 物件序列化 | ObjectOutputStream + BufferedOutputStream | 支援圖狀物件圖 |
new FileOutputStream(file, append)。