68

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

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

4

3 回答 3

179

最简单的方法可能是创建一个新的 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)
于 2013-04-16T18:25:26.023 回答
36

stream.PassThrough正如 natevw 所建议的,使用 a和end它与缓冲区一起使用更为惯用:

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

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

于 2015-01-15T13:17:42.813 回答
1

一种现代的简单方法,可在您使用 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)还是接受可读流的目的地,这都是非常可靠的。更大的文件应该实现
于 2020-07-01T17:31:11.130 回答