首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java IO 文件寫入完全指南:FileOutputStream/FileWriter 覆蓋與追加模式

     編輯:Java 相關知識

輸出流核心三步曲

  1. 建立流:連接目標數據源(檔案、網路、記憶體)。
  2. 寫入數據:調用 write() 將資料推入流緩衝區。
  3. 關閉流:close() 強制刷新緩衝區並釋放檔案鎖。

位元組流寫入:FileOutputStream

基本覆蓋模式(預設)


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() vs close()

  • flush():強制將緩衝區資料寫入磁碟,流保持開啟,可繼續寫入。
  • close():內部呼叫 flush(),再釋放檔案控制權,流不可再用。

關鍵場景:關鍵日誌每行 flush() 確保不丟失;批量寫入最後統一 close()。

字符流寫入:FileWriter

內建字符→位元組轉換,適合純文字檔案:


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(),編碼預設平台預設(建議顯式指定)。

指定編碼的最佳實踐(Java 11+)


// 位元組流 + 手動編碼
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)。
  • 編碼:永遠顯式指定 UTF-8,避免跨平台亂碼。
  • 緩衝:大量寫入必加 BufferedXxx。
  • 關閉:try-with-resources 保證資料落盤、資源釋放。
  • 協議:自定義格式時,讀寫順序、類型嚴格對應。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved