如何在具有可写流的循环中按顺序在 Node 中写入流?

Posted

技术标签:

【中文标题】如何在具有可写流的循环中按顺序在 Node 中写入流?【英文标题】:How to sequentially write a stream in Node in a loop with writeable Streams? 【发布时间】:2016-02-19 16:08:39 【问题描述】:

我想通过循环以特定顺序在 Node 中将行追加到文件中,该文件是可写流。

这是我所说的简化版本:

var fs = require('fs');
var outfile = fs.createWriteStream('outfile.txt');

for (var i = 0; i < 200; i++) 
    outfile.write('i', function (err, len) 
        console.log('written');
    );

我需要按顺序写入文件,这意味着它将按顺序写入12345...etc。我的理解是 outfile.write 是异步的,这意味着文件可能被乱序写入 - 这是正确的吗?

我从节点文档中看到

请注意,在同一个文件上多次使用 fs.write 而不等待回调是不安全的。对于这种情况,强烈建议使用 fs.createWriteStream。

所以我相信使用流是最好的,但是,我不确定在继续循环中的下一个迭代之前保证数据块已成功写入。我该怎么做呢?谢谢。

【问题讨论】:

【参考方案1】:

您可以通过使用fs.writeSync 来避免使用fs.createWriteStream,它没有像fs.write 这样的回调问题

【讨论】:

我不喜欢这个,因为代码的同步和阻塞特性。 在您的场景中,阻塞是问题定义所需要的。 @RūdolfsVikmanis,Writable 对象专为写入顺序数据而设计。这就是为什么它被称为stream,所以当你可以利用流功能时使用 writeSync() 是愚蠢的。【参考方案2】:

我认为对于当前的流和 2015 年的流,写入从来都不是异步并行的。写入流在内存中有一个缓冲区,您写入该缓冲区而不是直接写入硬盘。缓冲区将使您的序列保持正确的顺序。

【讨论】:

以上是关于如何在具有可写流的循环中按顺序在 Node 中写入流?的主要内容,如果未能解决你的问题,请参考以下文章

将数据管道传输到尚未准备好接收数据的可写流

Node.js 可写流:write vs _write

Node.js——Stream

nodejs fs 读取文件流一次读取多少数据

NodeJS 可写流 writev 在 1 和 highWaterMark 块之间交替

Node.js 可写流创建错误文件(更大且不可读)