Node.js 如何向文件追加内容?
Node.js 追加文件用 fs.appendFile(回调)、fs.promises.appendFile(async/await)或 fs.appendFileSync(同步);大数据量用 fs.createWriteStream 的 flag:'a' 流式追加。本文给出四种写法与适用场景。
小数据用 fs.appendFile,大数据/持续写入用 fs.createWriteStream 加 { flag: 'a' }。
方式一:fs.appendFile(回调式)
const fs = require('fs');
fs.appendFile('log.txt', '新的一行\n', (err) => {
if (err) {
console.error('追加失败:', err);
return;
}
console.log('追加成功');
});
文件不存在会自动创建——这也是它和 writeFile 的关键区别(writeFile 会覆盖原文件)。
方式二:Promise 版(async/await 推荐)
const fs = require('fs').promises;
await fs.appendFile('log.txt', '新的一行\n');
方式三:同步版(脚本场景)
const fs = require('fs');
fs.appendFileSync('log.txt', '新的一行\n');
同步会阻塞事件循环,只在 CLI 脚本、启动初始化等场景用。
方式四:流式追加(大文件/高频写入)
const fs = require('fs');
const stream = fs.createWriteStream('big.log', { flags: 'a' }); // flags:'a' 表示追加
stream.write('第一块数据\n');
stream.write('第二块数据\n');
stream.end();
流式写入不会一次性把内容装进内存,写日志收集器、导出大文件时必须用它。
怎么选
| 场景 | 方法 |
|---|---|
| 偶尔追加几行 | fs.promises.appendFile |
| 脚本里同步写 | fs.appendFileSync |
| 高频/大量持续写入 | fs.createWriteStream({flags:'a'}) |
常见问题(FAQ)
Q:appendFile 和 writeFile 带 flag:'a' 有区别吗?
功能等价,都是追加。appendFile 语义更清晰,推荐用它。
Q:并发追加同一个文件会串行吗?
并发 appendFile 调用的先后顺序不保证,应用层一次追加也不一定对应单次系统写入。需要完整记录与确定顺序时,应串行等待写入或统一使用一个写入队列;跨进程与网络文件系统还需额外协调。
Q:追加中文乱码?
确认写入字符串编码一致(Node 默认 UTF-8);如果是从别处读来的 Buffer,直接传 Buffer 而不做字符串转换。