FileWriter 详细解析与记忆方法
FileWriter 详细解析与记忆方法
一、FileWriter 核心概念
FileWriter
是 Java 中用于向文件写入字符数据的类,继承自 OutputStreamWriter
,属于字符流体系。
1. 核心特点
特性 | 说明 |
---|---|
继承关系 | Writer → OutputStreamWriter → FileWriter |
数据单位 | 字符(16位 Unicode) |
用途 | 写入文本文件(自动处理字符到字节的转换)(写普通文本用的) |
是否缓冲 | 默认无缓冲(需配合 BufferedWriter 使用) |
文件处理方式 | 默认覆盖文件,可通过构造方法选择追加模式 |
编码依赖 | 使用系统默认编码(可能因环境不同导致乱码) |
2. 构造方法
java
// 1. 通过文件路径创建(覆盖模式)
FileWriter fw = new FileWriter("output.txt");// 2. 追加模式写入
FileWriter fw = new FileWriter("output.txt", true); // 3. 通过File对象创建
File file = new File("output.txt");
FileWriter fw = new FileWriter(file);// 4. 通过文件描述符创建(较少用)
FileDescriptor fd = new FileDescriptor();
FileWriter fw = new FileWriter(fd);
3. 核心方法
方法 | 作用 |
---|---|
void write(int c) | 写入单个字符 |
void write(char[] cbuf) | 写入整个字符数组 |
void write(char[] cbuf, int off, int len) | 从数组的off 位置写入len 个字符 |
void write(String str) | 写入整个字符串 |
void write(String str, int off, int len) | 从字符串的off 位置写入len 个字符 |
void flush() | 强制将缓冲区内容写入磁盘 |
void close() | 关闭流 |
void append(String str) | 追加字符串 |
二、使用示例
1. 基础写入文件
java
try (FileWriter fw = new FileWriter("output.txt")) {fw.write('A'); // 写入单个字符fw.write("Hello"); // 写入字符串char[] data = {'世', '界'};fw.write(data); // 写入字符数组
}
2. 追加模式写入
java
try (FileWriter fw = new FileWriter("log.txt", true)) { // 追加模式fw.write("新的日志内容\n");
}
3. 高效写入(缓冲流)
java
try (BufferedWriter bw = new BufferedWriter(new FileWriter("large.txt"))) {bw.write("第一行内容");bw.newLine(); // 换行bw.write("第二行内容");
}
4. 指定编码写入(间接实现)
java
// 通过OutputStreamWriter指定编码
try (Writer writer = new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8")) {writer.write("中文内容");
}
三、记忆技巧
1. 名称解析法
"File + Writer"
File:操作文件
Writer:字符输出流
2. 对比记忆法
对比类 | 方向 | 数据单位 | 编码处理 | 典型用途 |
---|---|---|---|---|
FileWriter | 写入 | 字符 | 系统默认编码 | 写入系统默认编码的文本 |
OutputStreamWriter | 写入 | 字符 | 可指定编码(如UTF-8) | 需要明确编码的文本写入 |
FileOutputStream | 写入 | 字节 | 无编码处理 | 二进制文件写入 |
3. 使用场景联想
-
日志记录:
FileWriter
+ 追加模式 -
配置文件生成:按行写入配置项
-
数据导出:将程序数据导出为CSV/JSON文本
4. 常见误区提醒
❌ 错误用法:用 FileWriter
写入非默认编码文本
✅ 解决方案:
java
// 明确指定编码
new OutputStreamWriter(new FileOutputStream("file.txt"), "UTF-8");
四、面试高频问题
1. FileWriter 和 FileOutputStream 的区别?
-
FileWriter:按字符写入(自动编码转换),适合文本
-
FileOutputStream:按字节写入,适合二进制数据
2. 如何保证写入内容立即生效?
-
调用
flush()
方法强制刷盘:java
fw.write("重要内容");
fw.flush(); // 确保数据写入磁盘
3. 为什么需要 close() 或 try-with-resources?
-
释放资源:操作系统文件句柄
-
确保写入:缓冲数据可能尚未写入磁盘
4. 大文件写入如何优化性能?
java
// 使用缓冲流减少IO操作次数
try (BufferedWriter bw = new BufferedWriter(new FileWriter("big.txt"))) {for (int i = 0; i < 100000; i++) {bw.write("数据行" + i);bw.newLine();}
}
五、总结图示
mermaid
flowchart TDA[FileWriter] --> B[写入文本文件]A --> C[自动字符编码转换]A --> D[需配合缓冲流提升性能]B --> E[日志/配置文件等]D --> F[BufferedWriter]
一句话总结:
"FileWriter写文本,默认编码要留神,缓冲写入效率高,记得关闭或flush"
掌握这些知识点后,文本文件写入将变得得心应手! 🚀