401. Java 文件操作基础 - 使用 Buffered Stream I/O 写入文本文件

10 阅读3分钟

401. Java 文件操作基础 - 使用 Buffered Stream I/O 写入文本文件

在 Java 中,Files.newBufferedWriter(Path, Charset, OpenOption...) 方法可以创建一个 BufferedWriter,用于高效写入文本文件。


1️⃣ 基本写入示例

以下示例展示如何使用 US-ASCII 编码向文件写入文本:

import java.nio.file.*;
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.Charset;

public class WriteFileExample {
    public static void main(String[] args) {
        Path file = Paths.get("output.txt");
        Charset charset = Charset.forName("US-ASCII");
        String content = "Hello, Java BufferedWriter!\n";

        try (BufferedWriter writer = Files.newBufferedWriter(file, charset)) {
            writer.write(content, 0, content.length());
            System.out.println("文件写入完成!");
        } catch (IOException e) {
            System.err.format("写入文件异常: %s%n", e);
        }
    }
}

💡 注意点:

  • 使用 try-with-resources 自动关闭 BufferedWriter,避免资源泄漏
  • write(String, int, int) 方法可以指定从哪一位置开始写,以及写入多少字符
  • 如果文件不存在,newBufferedWriter 会创建新文件;如果文件存在,默认会 覆盖原文件

2️⃣ 常用 OpenOption 参数

你可以通过可变参数 OpenOption... 控制文件的写入行为,例如:

参数说明
WRITE打开文件进行写入
APPEND在文件末尾追加内容
CREATE文件不存在则创建
CREATE_NEW文件存在则抛异常
TRUNCATE_EXISTING覆盖已有文件内容(默认行为)

示例:追加写入文件:

try (BufferedWriter writer = Files.newBufferedWriter(file, charset, StandardOpenOption.APPEND)) {
    writer.write("追加一行文本\n");
}

3️⃣ 总结

  1. 对比 BufferedReader 与 BufferedWriter

    • BufferedReader 用于读取
    • BufferedWriter 用于写入
    • 都是基于缓冲区,效率高
  2. 演示覆盖与追加模式

    • 默认写入会覆盖原文件
    • 使用 APPEND 可在文件末尾追加
  3. 异常处理强调

    • I/O 操作可能抛出 IOException
    • 强调 try-with-resources 保证资源关闭
  4. 拓展示例

    • 向文件写入多行:
    List<String> lines = Arrays.asList("第一行", "第二行", "第三行");
    try (BufferedWriter writer = Files.newBufferedWriter(file, charset)) {
        for (String line : lines) {
            writer.write(line);
            writer.newLine(); // 写入换行符
        }
    }
    

1️⃣ 案例目标

  • 读取文本文件并统计行数
  • 查找包含指定关键字的行
  • 修改内容后写入新文件
  • 演示 BufferedReader/BufferedWriter + try-with-resources 使用

2️⃣ 完整代码示例

import java.nio.file.*;
import java.io.*;
import java.nio.charset.Charset;
import java.util.*;
import java.util.stream.Collectors;

public class FileIOExample {

    public static void main(String[] args) {
        Path inputFile = Paths.get("input.txt");      // 待处理文件
        Path outputFile = Paths.get("output.txt");    // 输出文件
        Charset charset = Charset.forName("UTF-8");   // 字符集

        // 关键字,用于查找行
        String keyword = "Java";

        // 1️⃣ 读取文件并统计行数,同时过滤包含关键字的行
        List<String> linesContainingKeyword = new ArrayList<>();
        long totalLines = 0;

        try (BufferedReader reader = Files.newBufferedReader(inputFile, charset)) {
            String line;
            while ((line = reader.readLine()) != null) {
                totalLines++;
                if (line.contains(keyword)) {
                    linesContainingKeyword.add(line);
                }
            }
            System.out.println("文件总行数: " + totalLines);
            System.out.println("包含关键字 '" + keyword + "' 的行数: " + linesContainingKeyword.size());
        } catch (IOException e) {
            System.err.format("读取文件异常: %s%n", e);
            return;
        }

        // 2️⃣ 写入新文件,演示追加模式
        try (BufferedWriter writer = Files.newBufferedWriter(outputFile, charset, 
                StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) {
            writer.write("=== 包含关键字 '" + keyword + "' 的行 ===\n");
            for (String line : linesContainingKeyword) {
                writer.write(line);
                writer.newLine(); // 写入换行符
            }
            System.out.println("处理结果已写入: " + outputFile);
        } catch (IOException e) {
            System.err.format("写入文件异常: %s%n", e);
        }
    }
}

3️⃣ 总结

  1. BufferedReader 读取文件
    • 使用 readLine() 按行读取
    • 自动忽略行结束符
    • 可以结合 Stream<String>(Java 8+)进行高级处理
  2. BufferedWriter 写入文件
    • 使用 write() 写内容
    • newLine() 插入平台独立的换行符
    • StandardOpenOption 控制文件创建、覆盖或追加
  3. try-with-resources
    • 自动关闭文件,避免资源泄漏
    • 捕获 IOException 并处理
  4. 实际演示
    • 在 input.txt 中加入多行测试数据
    • 演示统计总行数、筛选关键字、生成 output.txt
    • 可扩展:替换关键字、修改行内容