给定Readable
流(可以是process.stdin
或文件流),是否有可能/将pipe()
转换为自定义Writable
流,该流将填充子Writable
直到一定大小;然后关闭该子流;打开一个新的Writable
流并继续吗?
(上下文是将大量数据从管道上传到CDN,然后将其分成合理大小的块,而不必先将数据写入磁盘。)
我尝试过创建一个Writable
来处理_write
函数中子流的打开和关闭,但是问题是当传入的块太大而无法容纳现有子流时:它必须将一些块写入旧流创建新的流;然后等待新流上的open
事件,然后再完成_write
调用。
我想到的另一个想法是创建一个额外的Duplex
或Transform
流以缓冲管道,并确保进入Writable
的块绝对等于或小于现有子流可以接受的数量,以使Writable
有时间进行更改 child 流了过来。
另外,这是否会使所有事情都变得过于复杂,并且有更简单的方法来完成原始任务?
最佳答案
寻找相关问题的答案时,我碰到了这个问题。如何解析文件并将其行拆分为单独的文件,具体取决于行中的某些类别值。
我尽力更改了代码,使其与您的问题更加相关。但是,这很快就适应了。未经测试。将其视为伪代码。
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');
});