Java中实现文件追加需用FileOutputStream(file,true)或FileWriter(file,true),配合缓冲流提升性能;截断文件则通过RandomAccessFile.setLength()或FileChannel.truncate()完成。

Java 中实现文件的追加与截断,核心在于选择合适的 FileOutputStream 或 FileWriter 构造参数,以及使用 RandomAccessFile 精确控制文件内容边界。
用 FileOutputStream 实现追加写入
默认情况下 FileOutputStream 会覆盖原文件。要追加,需启用构造函数的 append 模式:
- 传入
new FileOutputStream(file, true)—— 第二个参数true表示追加 - 配合
BufferedOutputStream提升效率,但注意手动调用flush()或close() - 适用于字节级操作(如图片、二进制数据),也适合纯文本(需自行处理字符编码)
示例:
File file = new File("log.txt");try (FileOutputStream fos = new FileOutputStream(file, true);
PrintStream ps = new PrintStream(fos, true, "UTF-8")) {
ps.println("新日志行"); // 自动换行并刷新
}
用 FileWriter 实现文本追加
对纯文本更友好,内部自动处理字符编码和换行符转换:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 构造时传入
new FileWriter(file, true)启用追加模式 - 推荐搭配
BufferedWriter,提升写入性能 - 注意:
FileWriter默认使用平台默认编码,生产环境建议显式指定(如Files.newBufferedWriter(path, StandardCharsets.UTF_8))
示例:
try (FileWriter fw = new FileWriter("notes.txt", true);BufferedWriter bw = new BufferedWriter(fw)) {
bw.write("新增一行内容");
bw.newLine();
}
用 RandomAccessFile 截断文件
RandomAccessFile 支持随机读写和精确截断,是唯一能直接“砍掉”文件末尾的内置方式:
- 以
"rw"模式打开,确保可写 - 调用
setLength(long newLength)—— 若newLength < 当前长度,多余部分被丢弃 - 若
newLength > 当前长度,文件会扩展,新增字节为 0 - 注意:该操作不可逆,且不触发任何事件或回调
示例(保留前 100 字节):
try (RandomAccessFile raf = new RandomAccessFile("data.bin", "rw")) {raf.setLength(100); // 截断至 100 字节
}
用 Files.truncate()(Java 7+)替代方案
Files 工具类本身没有直接的 truncate 方法,但可通过 FileChannel 安全截断:
- 获取
FileChannel后调用truncate(size) - 比
RandomAccessFile更符合 NIO 风格,支持异步与非阻塞场景 - 需确保通道以读写方式打开,且文件存在
示例:
Path path = Paths.get("temp.dat");try (FileChannel channel = FileChannel.open(path, READ, WRITE)) {
channel.truncate(512); // 截断为 512 字节
}

















