【问题标题】:How to wrap a buffer as a stream2 Readable stream?如何将缓冲区包装为 stream2 可读流?
【发布时间】:2013-04-08 22:56:43
【问题描述】:

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

我已经找到了这个answer 和stream-buffers 模块,但是这个模块是基于stream1 接口的。

【问题讨论】:

    标签: node.js node.js-stream


    【解决方案1】:

    最简单的方法可能是创建一个新的 PassThrough 流实例,然后简单地将数据推送到其中。当您将其通过管道传输到其他流时,数据将从第一个流中提取出来。

    var stream = require('stream');
    
    // Initiate the source
    var bufferStream = new stream.PassThrough();
    
    // Write your buffer
    bufferStream.end(Buffer.from('Test data.'));
    
    // Pipe it to something else  (i.e. stdout)
    bufferStream.pipe(process.stdout)
    

    【讨论】:

    • 除非 node.js 在内部这样做,否则此解决方案不会将缓冲区分割成更小的块,因此对于某些管道目标可能不理想。 但是如果你看的话,流化器库也不是来自接受的答案。所以 +1 保持简单。
    • 我想知道使用var bufferStream = stream.PassThrough(); 是否可以让代码的后续读者更清楚地表达意图?
    • 另外,请注意,如果您的目的地希望流在某个时间结束,您可能需要致电 bufferStream.end()
    • @natevw 没有必要对缓冲区进行切片,因为 stream2 的内部代码会处理它(搜索“fromList”,here)。实际上,如果你对缓冲区进行切片,性能会更差,因为如果流需要读取比缓冲区长度更多的字节,那么如果你对它进行切片,streams2 将再次连接它们(here)。
    • 这需要两个步骤,而streamifier 只需要一个。
    【解决方案2】:

    正如 natevw 所建议的,将stream.PassThroughend 与缓冲区一起使用更加习惯:

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

    这也是缓冲区在vinyl-fs 中转换/管道的方式。

    【讨论】:

    • 你为什么要用整个缓冲区end?为什么end 会在pipe 之后出现
    • end( buffer ) 只是 write( buffer ) 然后是 end()。我结束了流,因为不再需要它。 end/pipe 的顺序在这里无关紧要,因为 PassThrough 仅在有一些数据事件处理程序(如管道)时才开始发送数据。
    • @Startec 不分割缓冲区意味着更少的开销。如果你的消费者不能处理大块,那么用分割块的东西来保护它。
    【解决方案3】:

    一种现代的简单方法,可在您使用 fs.createReadStream() 的任何地方使用,但无需先将文件写入路径。

    const {Duplex} = require('stream'); // Native Node Module 
    
    function bufferToStream(myBuuffer) {
        let tmp = new Duplex();
        tmp.push(myBuuffer);
        tmp.push(null);
        return tmp;
    }
    
    const myReadableStream = bufferToStream(your_buffer);
    
    • myReadableStream 可重复使用。
    • 缓冲区和流只存在于内存中,不会写入本地存储。
    • 当实际文件存储在某个云服务中并且我们的 API 充当中间人时,我经常使用这种方法。文件永远不会被写入本地文件。
    • 我发现无论缓冲区(最大 10 mb)还是接受可读流的目的地,这都是非常可靠的。更大的文件应该实现

    【讨论】:

      猜你喜欢
      • 2012-12-25
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 2014-07-13
      • 2018-04-15
      • 2019-11-26
      • 1970-01-01
      • 2019-07-30
      相关资源
      最近更新 更多