文章目录
- [401. Java 文件操作基础 - 使用 Buffered Stream I/O 写入文本文件](#401. Java 文件操作基础 - 使用 Buffered Stream I/O 写入文本文件)
-
- [1️⃣ 基本写入示例](#1️⃣ 基本写入示例)
- [2️⃣ 常用 OpenOption 参数](#2️⃣ 常用 OpenOption 参数)
- [3️⃣ 总结](#3️⃣ 总结)
- [1️⃣ 案例目标](#1️⃣ 案例目标)
- [2️⃣ 完整代码示例](#2️⃣ 完整代码示例)
- [3️⃣ 总结](#3️⃣ 总结)
401. Java 文件操作基础 - 使用 Buffered Stream I/O 写入文本文件
在 Java 中,Files.newBufferedWriter(Path, Charset, OpenOption...) 方法可以创建一个 BufferedWriter,用于高效写入文本文件。
1️⃣ 基本写入示例
以下示例展示如何使用 US-ASCII 编码向文件写入文本:
java
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 |
覆盖已有文件内容(默认行为) |
示例:追加写入文件:
java
try (BufferedWriter writer = Files.newBufferedWriter(file, charset, StandardOpenOption.APPEND)) {
writer.write("追加一行文本\n");
}
3️⃣ 总结
-
对比 BufferedReader 与 BufferedWriter:
- BufferedReader 用于读取
- BufferedWriter 用于写入
- 都是基于缓冲区,效率高
-
演示覆盖与追加模式:
- 默认写入会覆盖原文件
- 使用
APPEND可在文件末尾追加
-
异常处理强调:
- I/O 操作可能抛出
IOException - 强调 try-with-resources 保证资源关闭
- I/O 操作可能抛出
-
拓展示例:
- 向文件写入多行:
javaList<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️⃣ 完整代码示例
java
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️⃣ 总结
- BufferedReader 读取文件
- 使用
readLine()按行读取 - 自动忽略行结束符
- 可以结合
Stream<String>(Java 8+)进行高级处理
- 使用
- BufferedWriter 写入文件
- 使用
write()写内容 newLine()插入平台独立的换行符StandardOpenOption控制文件创建、覆盖或追加
- 使用
- try-with-resources
- 自动关闭文件,避免资源泄漏
- 捕获
IOException并处理
- 实际演示
- 在 input.txt 中加入多行测试数据
- 演示统计总行数、筛选关键字、生成 output.txt
- 可扩展:替换关键字、修改行内容