我有一个库,它以ReadableStream
作为输入参数,但我的输入只是一张base64格式的图片。我可以这样将我的数据转换成一个Buffer
:
var img = new Buffer(img_string, 'base64');
但我不知道如何将其转换为ReadableStream
,或者将我获得的Buffer
转换为ReadableStream
。
有什么办法可以做到这一点吗?
我有一个库,它以ReadableStream
作为输入参数,但我的输入只是一张base64格式的图片。我可以这样将我的数据转换成一个Buffer
:
var img = new Buffer(img_string, 'base64');
但我不知道如何将其转换为ReadableStream
,或者将我获得的Buffer
转换为ReadableStream
。
有什么办法可以做到这一点吗?
对于Node.js 10.17.0及以上版本:
const { Readable } = require('stream');
const stream = Readable.from(myBuffer);
类似这样的内容...
import { Readable } from 'stream'
const buffer = new Buffer(img_string, 'base64')
const readable = new Readable()
readable._read = () => {} // _read is required but you can noop it
readable.push(buffer)
readable.push(null)
readable.pipe(consumer) // consume the stream
在一般情况下,可读流的 _read
函数应该从底层源收集数据并逐步使用 push
方法将其推送,以确保在需要之前不会将大量源代码收集到内存中。_read
。_read()
方法内部 push()
缓冲区是否更正确呢?即 readable._read = () => {readable.push(buffer); readable.push(null);}
。不确定这是否重要,但允许流管理何时提供数据似乎不太可能遇到意外行为。除此之外,这应该是被接受的答案,因为它不依赖于第三方模块。 - broofaread
方法内部使用push
。从概念上讲,我认为_read
应该保留用于从底层源中“收集”数据。在这种情况下,我们不仅在内存中拥有数据,而且不需要进行转换。因此,对于将数据包装在流中,这就是我会这样做的方式,但是对于在流中转换或累积数据,该逻辑将发生在_read
方法中。 - Mr5o1Node Stream Buffer(节点流缓存) 明显是为测试设计的;无法避免延迟使其在生产环境中使用不佳。
Gabriel Llamas(加布里埃尔·利亚马斯) 在这个答案中建议使用streamifier:如何将缓冲区包装成可读的 stream2 Readable 流?
您可以使用Node Stream Buffers创建一个可读流,方法如下:
// Initialize stream
var myReadableStreamBuffer = new streamBuffers.ReadableStreamBuffer({
frequency: 10, // in milliseconds.
chunkSize: 2048 // in bytes.
});
// With a buffer
myReadableStreamBuffer.put(aBuffer);
// Or with a string
myReadableStreamBuffer.put("A String", "utf8");
频率不能为0,因此这将引入一定的延迟。
您可以使用标准的NodeJS流API进行操作 - stream.Readable.from
const { Readable } = require('stream');
const stream = Readable.from(buffer);
注意:如果缓冲区包含二进制数据,请勿将其转换为字符串(使用buffer.toString()
)。这会导致二进制文件损坏。您不需要为单个文件添加整个npm库。我将其重构为TypeScript:
import { Readable, ReadableOptions } from "stream";
export class MultiStream extends Readable {
_object: any;
constructor(object: any, options: ReadableOptions) {
super(object instanceof Buffer || typeof object === "string" ? options : { objectMode: true });
this._object = object;
}
_read = () => {
this.push(this._object);
this._object = null;
};
}
基于node-streamifier(如上所述,是最佳选择)。
这是我对此的简单代码。
import { Readable } from 'stream';
const newStream = new Readable({
read() {
this.push(someBuffer);
},
})
const streamifier = require('streamifier');
streamifier.createReadStream(new Buffer ([97, 98, 99])).pipe(process.stdout);
const toStream = require('tostream'); toStream(new Buffer ([97, 98, 99])).pipe(process.stdout);
- Yushin Washio试试这个:
const Duplex = require('stream').Duplex; // core NodeJS API
function bufferToStream(buffer) {
let stream = new Duplex();
stream.push(buffer);
stream.push(null);
return stream;
}
来源: Brian Mancini -> http://derpturkey.com/buffer-to-stream-in-node/
这篇文章介绍了在Node.js中如何将Buffer转换为Stream。通过使用Node.js内置的Transform流,可以将Buffer对象有效地转换为可读流或可写流。此外,该文章还提供了一些实用代码示例,以帮助读者更好地理解如何使用这些流进行数据处理。
.toString()
将会破坏它。 - Ihor Sakailiuk