Node.js:将可读streampipe道拆分为多个顺序可写的stream
给定一个Readable
stream(可能是process.stdin
或者一个文件stream),将pipe()
传递给一个自定义的Writable
stream是可能的/实际的,这将会填充一个孩子Writable
直到一定的大小。 然后closures那个子stream; 打开一个新的Writable
stream并继续?
(上下文是将大量数据从stream水线上传到CDN,并将其分成合理大小的块,而不必先将数据写入磁盘。)
我试过创build一个Writable
来处理_write
函数中的子stream的打开和closures,但是当传入的块太大而不能适应现有的子stream时,问题就来了:它必须写一些块到旧溪stream 创build新的stream; 然后在完成_write
调用之前等待新stream上的open
事件。
我想的另一个想法是创build一个额外的Duplex
或Transform
stream来缓冲pipe道,并确保进入Writable
的块肯定等于或小于现有子stream可接受的数量,以给Writable
时间改变孩子stream了过来。
或者,这是否过度复杂,有一个更简单的方法来完成原来的任务?
在寻找相关问题的答案时,我碰到了这个问题。 如何parsing一个文件,并根据行中的某个类别值将它的行分成不同的文件。
我尽我所能改变我的代码,使其与您的问题更相关。 但是,这很快就适应了。 没有testing。 将其视为伪代码。
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'); });
我将在Readable
和Writable
stream之间引入一个Transform
。 而在其_transform
,我会尽我所能的所有逻辑。
也许,我只会有一个Readable和一个转换。 _transform
方法将创build我需要的所有可写的stream
就我个人而言,只有当我将数据转储到某个地方时,才会使用可写的数据stream,而且我将会处理该数据块。
我尽可能避免实现_read
和_write
,并滥用转换stream。
但是,我不明白你的问题是写大小。 你是什么意思?