![](/img/trans.png)
[英]How to pipe one readable stream into two writable streams at once in Node.js?
[英]Node.js: splitting a readable stream pipe to multiple sequential writable streams
给定一个Readable
流(可能是process.stdin
或文件流), pipe()
是否可行/切实可行的Writable
流将填充子Writable
直到某个大小; 然后关闭那个孩子的流; 打开一个新的Writable
流并继续?
(上下文是将大量数据从管道上传到CDN,将其分成合理大小的块,而不必先将数据写入磁盘。)
我已经尝试创建一个Writable
来处理_write
函数中子流的打开和关闭,但是当传入的块太大而不适合现有的子流时会出现问题:它必须将一些块写入旧溪流; 创建新流; 然后在完成_write
调用之前等待新流上的open
事件。
另一个想法是创建一个额外的Duplex
或Transform
流来缓冲管道,并确保进入Writable
的块肯定等于或小于现有子流可以接受的数量,以便给Writable
时间更改孩子流过来。
或者,这是否使一切过于复杂,并且有一种更简单的方法来完成原始任务?
我将在Readable
和Writable
流之间引入一个Transform
。 在它的_transform
,我会做我需要的所有逻辑。
也许,我只会有一个Readable和一个Transform。 _transform
方法将创建我需要的所有可写流
就个人而言,我只在我将数据转储到某个地方时才使用可写流,并且我将完成处理该块。
我尽量避免实现_read
和_write
并滥用Transform流。
但我在你的问题中不明白的一点是写大小。 你是什么意思?
在寻找相关问题的答案时,我碰到了这个问题。 如何解析文件并将其行拆分为单独的文件,具体取决于行中的某些类别值。
我尽力改变我的代码,使其与您的问题更相关。 然而,这很快就适应了。 没有测试过。 将其视为伪代码。
var fs = require('fs'),
through = require('through');
var destCount = 0, dest, size = 0, MAX_SIZE = 1000;
readableStream
.on('data', function(data) {
var out = data.toString() + "\n";
size += out.length;
if(size > MAX_SIZE) {
dest.emit("end");
dest = null;
size = 0;
}
if(!dest) {
// option 1. manipulate data before saving them.
dest = through();
dest.pipe(fs.createWriteStream("log" + destCount))
// option 2. write directly to file
// dest = fs.createWriteStream("log" + destCount);
}
dest.emit("data", out);
})
.on('end', function() {
dest.emit('end');
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.