123

我对 Buffers 和 ReadableStreams 还很陌生,所以也许这是一个愚蠢的问题。我有一个将 a 作为输入的库ReadableStream,但我的输入只是一个 base64 格式的图像。我可以Buffer像这样转换我拥有的数据:

var img = new Buffer(img_string, 'base64');

但我不知道如何将其转换为 aReadableStream或将Buffer我获得的转换为 a ReadableStream

有没有办法做到这一点,还是我试图实现不可能?

谢谢。

4

9 回答 9

141

对于 nodejs 10.17.0 及更高版本:

const { Readable } = require('stream');

const stream = Readable.from(myBuffer.toString());
于 2020-06-02T00:52:39.797 回答
82

像这样的东西......

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不需要。

推送整个缓冲区只是将其包装在可读流 api 中。

于 2017-05-20T22:52:53.260 回答
36

Node Stream Buffer显然是为测试而设计的;无法避免延迟使其成为生产使用的糟糕选择。

Gabriel Llamas在这个答案中 建议使用流化器:How to wrap a buffer as a stream2 Readable stream?

于 2013-08-12T14:58:28.553 回答
31

您可以使用Node Stream Buffers创建 ReadableStream ,如下所示:

// 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,所以这会引入一定的延迟。

于 2013-01-16T23:08:44.990 回答
7

您不需要为单个文件添加整个 npm 库。我将它重构为打字稿:

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(如上所述的最佳选择)。

于 2019-05-04T13:28:31.170 回答
6

这是我的简单代码。

import { Readable } from 'stream';

const newStream = new Readable({
                    read() {
                      this.push(someBuffer);
                    },
                  })
于 2020-03-17T11:20:13.247 回答
6

这是一个使用流化器模块的简单解决方案。

const streamifier = require('streamifier');
streamifier.createReadStream(new Buffer ([97, 98, 99])).pipe(process.stdout);

您可以使用字符串、缓冲区和对象作为其参数。

于 2018-01-09T03:22:38.220 回答
5

您可以为此使用标准的 NodeJS 流 API - stream.Readable.from

const { Readable } = require('stream');
const stream = Readable.from(buffer);

buffer.toString()注意:如果缓冲区包含二进制数据,请勿将缓冲区转换为字符串 ( )。这将导致损坏的二进制文件。

于 2022-01-04T17:29:05.127 回答
2

尝试这个:

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/

于 2020-05-17T12:03:01.430 回答