Java FileWriter
外观
Java FileWriter 是 Java IO 体系中用于将字符数据写入文件的类,属于 java.io
包。它是 Writer
类的子类,专门用于处理文本文件的写入操作,支持字符编码(默认使用系统编码,也可手动指定)。与 FileOutputStream
不同,FileWriter
直接操作字符而非字节,适合文本数据处理。
核心特性[编辑 | 编辑源代码]
- 字符流写入:自动将字符转换为字节(通过内置的
OutputStreamWriter
实现)。 - 覆盖/追加模式:通过构造函数参数控制是否追加到文件末尾。
- 自动缓冲:通常配合
BufferedWriter
使用以提高性能。 - 异常处理:必须处理
IOException
。
构造函数[编辑 | 编辑源代码]
FileWriter
提供以下常用构造函数:
// 1. 创建新文件或覆盖现有文件
FileWriter writer1 = new FileWriter("example.txt");
// 2. 追加模式(不覆盖原有内容)
FileWriter writer2 = new FileWriter("example.txt", true);
// 3. 通过 File 对象指定文件
File file = new File("example.txt");
FileWriter writer3 = new FileWriter(file);
基础用法示例[编辑 | 编辑源代码]
以下示例演示如何写入多行文本并处理异常:
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) {
try (FileWriter writer = new FileWriter("output.txt")) {
writer.write("Hello, Java FileWriter!\n");
writer.write("这是第二行内容。\n");
writer.append("通过append()方法添加的内容"); // append()返回Writer对象,支持链式调用
} catch (IOException e) {
System.err.println("写入文件时出错: " + e.getMessage());
}
}
}
输出文件内容 (output.txt
):
Hello, Java FileWriter! 这是第二行内容。 通过append()方法添加的内容
性能优化[编辑 | 编辑源代码]
直接使用 FileWriter
每次写入会触发磁盘I/O,建议结合缓冲:
import java.io.BufferedWriter;
import java.io.FileWriter;
try (BufferedWriter bw = new BufferedWriter(new FileWriter("data.txt"))) {
for (int i = 0; i < 10000; i++) {
bw.write("Line " + i + "\n");
}
}
字符编码处理[编辑 | 编辑源代码]
默认使用系统编码,如需指定编码应使用 OutputStreamWriter
:
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
FileWriter writer = new OutputStreamWriter(
new FileOutputStream("utf8.txt"), StandardCharsets.UTF_8
);
实际应用场景[编辑 | 编辑源代码]
场景1:日志记录器[编辑 | 编辑源代码]
将程序运行日志写入文件:
public class Logger {
private static final String LOG_FILE = "app.log";
public static void log(String message) {
try (FileWriter fw = new FileWriter(LOG_FILE, true);
BufferedWriter bw = new BufferedWriter(fw)) {
bw.write(LocalDateTime.now() + " - " + message + "\n");
} catch (IOException e) {
System.err.println("日志写入失败: " + e.getMessage());
}
}
}
场景2:配置文件生成[编辑 | 编辑源代码]
动态生成JSON配置文件:
public void generateConfig(Map<String, String> settings) throws IOException {
try (FileWriter writer = new FileWriter("config.json")) {
writer.write("{\n");
int count = 0;
for (Map.Entry<String, String> entry : settings.entrySet()) {
writer.write(String.format(" \"%s\": \"%s\"%s\n",
entry.getKey(),
entry.getValue(),
(++count < settings.size()) ? "," : ""));
}
writer.write("}");
}
}
与相关类的对比[编辑 | 编辑源代码]
类名 | 数据类型 | 是否缓冲 | 编码支持 | 典型用途 |
---|---|---|---|---|
FileWriter |
字符 | 否 | 系统默认/构造函数指定 | 简单文本写入 |
BufferedWriter |
字符 | 是 | 依赖底层Writer | 高频文本写入 |
FileOutputStream |
字节 | 否 | 不适用 | 二进制文件写入 |
异常处理最佳实践[编辑 | 编辑源代码]
推荐使用 try-with-resources 确保资源释放:
try (FileWriter writer = new FileWriter("important.txt")) {
writer.write("关键数据");
} catch (IOException e) {
// 1. 记录详细错误日志
// 2. 考虑重试或通知管理员
throw new RuntimeException("文件操作失败", e);
}
高级主题:文件锁定[编辑 | 编辑源代码]
在多线程/进程环境中,可能需要文件锁控制:
try (FileChannel channel = new FileOutputStream("shared.txt").getChannel();
FileLock lock = channel.lock();
FileWriter writer = new FileWriter("shared.txt")) {
writer.write("独占写入的内容");
}
常见问题[编辑 | 编辑源代码]
Q: 为什么写入内容没有立即出现在文件中?
A: 数据可能还在缓冲区,调用 flush()
强制写入或关闭Writer。
Q: 如何换行兼容不同操作系统?
A: 使用 System.lineSeparator()
或 %n
格式符:
writer.write("第一行" + System.lineSeparator());
writer.write(String.format("第二行%n"));
数学表示(可选)[编辑 | 编辑源代码]
写入操作的吞吐量可表示为: 其中:
- :吞吐量(字符/秒)
- :总字符数
- :总时间
- :缓冲区大小