Java FileReader 與 FileWriter

FileReaderFileWriter 是用於讀寫文字檔案的字元串流類別。

引入套件

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

FileWriter 寫入檔案

基本寫入

try (FileWriter writer = new FileWriter("output.txt")) {
    writer.write("Hello, World!");
    writer.write("\n");
    writer.write("這是第二行");
} catch (IOException e) {
    e.printStackTrace();
}

附加模式

// 第二個參數 true 表示附加模式
try (FileWriter writer = new FileWriter("output.txt", true)) {
    writer.write("新增的內容\n");
} catch (IOException e) {
    e.printStackTrace();
}

寫入字元陣列

try (FileWriter writer = new FileWriter("output.txt")) {
    char[] chars = {'H', 'e', 'l', 'l', 'o'};
    writer.write(chars);

    // 寫入部分字元
    writer.write(chars, 0, 3);  // Hel
} catch (IOException e) {
    e.printStackTrace();
}

FileReader 讀取檔案

逐字元讀取

try (FileReader reader = new FileReader("input.txt")) {
    int ch;
    while ((ch = reader.read()) != -1) {
        System.out.print((char) ch);
    }
} catch (IOException e) {
    e.printStackTrace();
}

讀取到字元陣列

try (FileReader reader = new FileReader("input.txt")) {
    char[] buffer = new char[1024];
    int length;
    StringBuilder content = new StringBuilder();

    while ((length = reader.read(buffer)) != -1) {
        content.append(buffer, 0, length);
    }
    System.out.println(content);
} catch (IOException e) {
    e.printStackTrace();
}

指定編碼

FileReader/FileWriter 使用系統預設編碼,若需指定編碼,使用 InputStreamReader/OutputStreamWriter

import java.io.*;
import java.nio.charset.StandardCharsets;

// 讀取 UTF-8 檔案
try (Reader reader = new InputStreamReader(
        new FileInputStream("input.txt"), StandardCharsets.UTF_8)) {
    // 讀取操作
}

// 寫入 UTF-8 檔案
try (Writer writer = new OutputStreamWriter(
        new FileOutputStream("output.txt"), StandardCharsets.UTF_8)) {
    writer.write("UTF-8 內容");
}

搭配 BufferedReader/BufferedWriter

為提升效能,通常搭配緩衝類別使用:

// 讀取
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
}

// 寫入
try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
    writer.write("第一行");
    writer.newLine();  // 跨平台換行
    writer.write("第二行");
}

實用範例

複製文字檔

public static void copyTextFile(String source, String dest) throws IOException {
    try (FileReader reader = new FileReader(source);
         FileWriter writer = new FileWriter(dest)) {
        char[] buffer = new char[4096];
        int length;
        while ((length = reader.read(buffer)) != -1) {
            writer.write(buffer, 0, length);
        }
    }
}

讀取檔案為字串

public static String readFileToString(String path) throws IOException {
    StringBuilder content = new StringBuilder();
    try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
        String line;
        while ((line = reader.readLine()) != null) {
            content.append(line).append(System.lineSeparator());
        }
    }
    return content.toString();
}

重點整理

  • FileWriter 寫入文字檔案,FileReader 讀取文字檔案
  • 使用 try-with-resources 自動關閉串流
  • 附加模式:new FileWriter(path, true)
  • 需要指定編碼時使用 InputStreamReader/OutputStreamWriter
  • 搭配 BufferedReader/BufferedWriter 提升效能
  • 現代 Java 可用 Files.readString()Files.writeString()