如何在具有可写流的循环中按顺序在 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 中写入流?的主要内容,如果未能解决你的问题,请参考以下文章