Как обернуть буфер как поток Stream2 Читаемый поток?

Как я могу преобразовать буфер node.js в читаемый поток, используя интерфейс stream2?

Я уже нашел этот ответ и модуль stream-buffers, но этот модуль основан на интерфейсе stream1.

3 ответа

Решение

С помощью Streamifier вы можете конвертировать строки и буферы в читаемые потоки с новым API потока.

Возможно, самый простой способ - создать новый экземпляр потока PassThrough и просто вставить в него ваши данные. Когда вы передадите его в другие потоки, данные будут извлечены из первого потока.

var stream = require('stream');

// Initiate the source
var bufferStream = new stream.PassThrough();

// Write your buffer
bufferStream.end(new Buffer('Test data.'));

// Pipe it to something else  (i.e. stdout)
bufferStream.pipe(process.stdout)

Как предположил natevw, еще более идиоматично использовать stream.PassThrough, а также end это с буфером:

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

Это также, как буферы конвертируются / передаются в винил-фс.

Современный простой подход, который можно использовать везде, где вы бы использовали 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 МБ) или места назначения, которое принимает читаемый поток. Файлы большего размера должны реализовывать
Другие вопросы по тегам