使用readline.createInterface读取文件时出现行丢失的异常问题
原因分析
- 核心矛盾在于可读流的自动流动特性与异步操作的时序冲突:
- 调用
createReadStream创建流后,Node.js默认将流设为「流动模式」——会自动读取文件内容并触发data事件。 - 创建
readline接口后,并没有立即启动数据消费(for await...of还未执行)。此时流触发的data事件没有被处理,Node.js的默认行为是直接丢弃这些未被监听的数据。 await fs.readFile(...)会让主线程暂停处理当前流,转而读取另一个文件。这段时间内,输入流已经读取了大量数据并触发data事件,但这些数据因为没有被readline及时处理而丢失。- 当
for await...of开始迭代时,readline只能从流的当前位置继续读取,之前丢失的数据无法被计数,因此结果小于预期值;又因为每次fs.readFile的耗时和流读取速度存在波动,最终输出结果不稳定。
- 调用
- 移除
fs.readFile后,for await...of会立即启动,readline会及时捕获并处理流的所有data事件,所有数据都被正确计数,因此结果稳定为100000。
内容的提问来源于stack exchange,提问作者bcoughlan
相关产品推荐
相关产品推荐

