FileWriter fw = new FileWriter("file.txt", true);
结合BufferedWriter写入数据,或使用Files.write()方法(Java7+)指定StandardOpenOption.APPEND选项,确保及时关闭流以释放资源。核心原理
Java IO通过追加模式(append mode) 实现内容续写,关键是在创建输出流时设置append
参数为true
,默认情况下(false
)会覆盖原文件。
4种实现方法及代码示例
使用 FileWriter
(字符流,简单场景)
import java.io.FileWriter; import java.io.IOException; public class AppendExample { public static void main(String[] args) { // 关键:第二个参数 true 表示追加模式 try (FileWriter writer = new FileWriter("demo.txt", true)) { writer.write("新增内容n"); // 写入字符串 writer.append("另一行内容n"); // append()方法同样适用 } catch (IOException e) { e.printStackTrace(); } } }
- 优点:代码简洁,自动处理字符编码(默认UTF-8)。
- 缺点:无缓冲区,频繁写入时性能低。
使用 BufferedWriter
+ FileWriter
(字符流,推荐)
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class AppendExample { public static void main(String[] args) { // 组合使用缓冲区和追加模式 try (BufferedWriter writer = new BufferedWriter( new FileWriter("demo.txt", true))) { writer.write("带缓冲的高效写入"); writer.newLine(); // 插入换行符 } catch (IOException e) { e.printStackTrace(); } } }
- 优点:缓冲区大幅提升写入效率,适合高频操作。
- 最佳实践:始终用
try-with-resources
自动关闭资源。
使用 FileOutputStream
(字节流,非文本文件)
import java.io.FileOutputStream; import java.io.IOException; public class AppendExample { public static void main(String[] args) { // 第二个参数 true 启用追加模式 try (FileOutputStream fos = new FileOutputStream("data.bin", true)) { byte[] bytes = "二进制数据".getBytes(); fos.write(bytes); // 写入字节数组 } catch (IOException e) { e.printStackTrace(); } } }
- 适用场景:图片、音视频等二进制文件。
- 注意:文本文件需手动处理编码(如
.getBytes("UTF-8")
)。
使用 Files
类(Java 7+,简洁API)
import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.io.IOException; import java.util.Arrays; import java.util.List; public class AppendExample { public static void main(String[] args) { List<String> lines = Arrays.asList("第一行", "第二行"); try { // StandardOpenOption.APPEND 指定追加模式 Files.write(Paths.get("demo.txt"), lines, StandardOpenOption.APPEND, StandardOpenOption.CREATE); // 文件不存在时创建 } catch (IOException e) { e.printStackTrace(); } } }
- 优点:一行代码完成写入,支持集合批量操作。
- 缺点:每次调用全量写入,频繁小数据写入效率低。
关键注意事项
- 资源释放:
- 必须用
try-with-resources
或finally
块关闭流,防止资源泄漏。
- 必须用
- 异常处理:
- 捕获
IOException
并合理处理(如日志记录),避免程序中断。
- 捕获
- 字符编码:
- 跨平台场景显式指定编码(如
new OutputStreamWriter(fos, "UTF-8")
)。
- 跨平台场景显式指定编码(如
- 性能优化:
- 高频写入优先选
BufferedWriter
,减少磁盘IO次数。
- 高频写入优先选
- 并发安全:
- 多线程写入时需同步控制(如
synchronized
或ReentrantLock
)。
- 多线程写入时需同步控制(如
方法对比
方法 | 适用场景 | 性能 | 易用性 |
---|---|---|---|
FileWriter |
少量文本写入 | 高 | |
BufferedWriter |
高频文本追加 | 高 | |
FileOutputStream |
二进制文件 | 中 | |
Files.write() |
批量写入/Java 7+ | 极高 |
常见问题解决
-
Q:追加后文件内容混乱?
A:检查是否遗漏换行符(n
或writer.newLine()
)。 -
Q:权限不足导致写入失败?
A:确认文件是否被其他进程锁定,或用户是否有写权限。 -
Q:中文乱码?
A:明确指定编码(如new FileWriter("log.txt", StandardCharsets.UTF_8, true)
)。
最佳实践建议
- 文本文件:优先用
BufferedWriter
+FileWriter
组合。 - 二进制文件:选
FileOutputStream
。 - 简洁需求:Java 7+项目直接用
Files.write()
。 - 生产环境:添加异常日志监控(如Log4j)。
引用说明:本文代码基于Oracle官方Java 17 API文档实现,遵循Java SE规范,实践建议参考《Effective Java》第三版及阿里Java开发手册。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/26685.html