123

私はBuffersとReadableStreamsにかなり慣れていないので、おそらくこれはばかげた質問です。を入力として受け取るライブラリがありますReadableStreamが、入力はbase64形式の画像にすぎません。私は次のように私が持っているデータを変換することができますBuffer

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

ReadableStreamしかし、それをに変換する方法や、Buffer取得したIをに変換する方法がわかりません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

ノードストリームバッファは、明らかにテストで使用するために設計されています。遅延を回避できないため、本番環境での使用には適していません。

Gabriel Llamasは、この回答で ストリーミファイアを提案しています。バッファをstream2読み取り可能ストリームとしてラップする方法は?

于 2013-08-12T14:58:28.553 に答える
31

次のように、ノードストリームバッファを使用して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

1つのファイルにnpmlib全体を追加する必要はありません。私はそれを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に基づいています(上記の最良のオプション)。

于 2019-05-04T13:28:31.170 に答える
6

これは、ストリーミファイアモジュールを使用した簡単なソリューションです。

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

Strings、Buffer、Objectを引数として使用できます。

于 2018-01-09T03:22:38.220 に答える
6

これは私の簡単なコードです。

import { Readable } from 'stream';

const newStream = new Readable({
                    read() {
                      this.push(someBuffer);
                    },
                  })
于 2020-03-17T11:20:13.247 に答える
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 に答える