【发布时间】:2013-04-08 22:56:43
【问题描述】:
如何使用 stream2 接口将 node.js 缓冲区转换为可读流?
我已经找到了这个answer 和stream-buffers 模块,但是这个模块是基于stream1 接口的。
【问题讨论】:
如何使用 stream2 接口将 node.js 缓冲区转换为可读流?
我已经找到了这个answer 和stream-buffers 模块,但是这个模块是基于stream1 接口的。
【问题讨论】:
最简单的方法可能是创建一个新的 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)
【讨论】:
var bufferStream = stream.PassThrough(); 是否可以让代码的后续读者更清楚地表达意图?
bufferStream.end()。
streamifier 只需要一个。
正如 natevw 所建议的,将stream.PassThrough 和end 与缓冲区一起使用更加习惯:
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 仅在有一些数据事件处理程序(如管道)时才开始发送数据。
一种现代的简单方法,可在您使用 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);
【讨论】: