2013-04-16 49 views

回答

12

使用streamifier您可以将字符串和缓冲区转换为具有新流api的可读流。

+0

这对于任何选项(如流缓存或Windows Azure博客上的一个解决方案)都是最好的。这绝对是最快的。 – Abadaba

+8

这个库看起来不错,但@ zjonsson的答案几乎和使用一样容易,只要npmjs不会再次下降... [内定轻微,只要npmjs不会再次下降]。 – natevw

108

最简单的方法可能是创建一个新的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) 
+7

除非node.js在内部执行此操作,否则此解决方案不会将缓冲区分成更小的块,因此可能不适用于某些管道目标。 *但是*如果你看,从接受的答案也没有流化器库。所以+1保持简单。 – natevw

+2

我不知道是否使用'var bufferStream = stream.PassThrough();'可能会让代码的更高版本读者更清楚,但是? – natevw

+0

另外,请注意,如果您的目标期望流在某点完成,您可能需要调用'bufferStream.end()'。 – natevw

24

作为natevw建议的,它更惯用使用stream.PassThrough,并用缓冲液end它:

var buffer = new Buffer('foo'); 
var bufferStream = new stream.PassThrough(); 
bufferStream.end(buffer); 
bufferStream.pipe(process.stdout); 

这也是缓冲器如何被转换/管道中vinyl-fs

+1

你为什么要用整个缓冲区结束?为什么'end'在'pipe'之后出现 – Startec

+3

'end(buffer)'只是'write(buffer)',然后'end()'。我结束了流,因为它不再需要。结束/管道顺序在这里并不重要,因为PassThrough只有在有数据事件的某个处理程序(如管道)时才会开始发送数据。 – morris4

+1

@Startec不切片缓冲意味着更少的开销。如果你的消费者不能处理大块,那么用分块的东西来保护它。 – binki