如何将缓冲区包装为stream2可读流?

Jer*_*NER 60 node.js node.js-stream

如何在使用stream2接口后将node.js缓冲区转换为可读流?

我已经找到了这个答案和stream-buffers模块,但是这个模块基于stream1接口.

小智 159

最简单的方法可能是创建一个新的PassThrough流实例,然后简单地将数据推入其中.当您将其传输到其他流时,数据将从第一个流中拉出.

var stream = require('stream');

// Initiate the source
var bufferStream = new stream.PassThrough();

// Write your buffer
bufferStream.end(new Buffer('Test data.'));

// Pipe it to something else  (i.e. stdout)
bufferStream.pipe(process.stdout)
Run Code Online (Sandbox Code Playgroud)

  • 除非node.js在内部执行此操作,否则此解决方案不会将缓冲区切割为较小的块,因此可能不适合某些管道目标.*但是*如果你看,流水化器库也没有来自接受的答案.所以+1保持简单. (12认同)
  • @natevw没有必要对缓冲区进行切片,因为streams2的内部代码会处理它(搜索"fromList",[here](https://github.com/joyent/node/blob/master/lib/_stream_readable.js )).实际上,如果切片缓冲区,性能会更差,因为如果流需要读取的字节多于缓冲区长度,那么如果你对它进行切片,则streams2会再次连接它们([here](https://github.com) /joyent/node/blob/master/lib/_stream_readable.js#L832)). (7认同)
  • 我确实想知道是否使用`var bufferStream = stream.PassThrough();`可能会使代码的后来读者更清楚? (3认同)

mor*_*is4 32

正如natevw建议的那样,使用a stream.PassThroughend缓冲区更加惯用:

var buffer = new Buffer( 'foo' );
var bufferStream = new stream.PassThrough();
bufferStream.end( buffer );
bufferStream.pipe( process.stdout );
Run Code Online (Sandbox Code Playgroud)

这也是乙烯基 -fs中缓冲区转换/管道的方式.

  • `end(buffer)`只是`write(buffer)`然后是`end()`.我结束了流,因为它不再需要了.结束/管道的顺序在这里无关紧要,因为当有一些数据事件处理程序(如管道)时,PassThrough只会开始发送数据. (4认同)
  • 为什么你要用整个缓冲区结束?为什么`end`来自`pipe` (2认同)

Gab*_*mas 16

使用流化器,您可以使用新流api将字符串和缓冲区转换为可读流.

  • 这个库看起来很好,但是@ zjonsson的答案几乎同样易于使用,只要npmjs不会再次失效,那就是[无可否认的轻微...]内置的优势. (9认同)