Работа с каналами в NodeJS

Ситуация, в которой нам нужно прочитать данные из одного потока и записать их в другой, является достаточно распространенной. Для упрощения такой операции придуманы каналы (англ. pipes).

Давайте посмотрим, как это делается. Пусть у нас есть поток чтения и поток записи:

let readableStream = fs.createReadStream('readme.txt', 'utf8'); let writeableStream = fs.createWriteStream('writeme.txt');

Сделаем так, чтобы поток чтения сразу перенаправлялся в поток записи. Для этого у потоков чтения существует метод pipe:

readableStream.pipe(writeableStream);

С помощью канала прочитайте файл и запишите его данные в другой файл.

Цепочки

Методы pipe можно вызывать цепочкой друг за другом. При этом каждый вызов метода в цепочке позволяет выполнять над данными некоторые операции:

readableStream.pipe(операция).pipe(операция).pipe(операция);

Для примера давайте выполним архивацию файла. Для этого нам надо сначала считать файл, затем сжать данные и в конце записать сжатые данные в файл-архив. В этом нам поможет встроенная в NodeJS библиотека zlib:

import { createGzip } from 'zlib';

Теперь с помощью цепочки методов сначала заархивируем поток чтения, а потом запишем в поток записи:

readableStream.pipe(createGzip()).pipe(writeableStream);

Даны 10 файлов. Напишите код, который зархивирует каждый из этих файлов в свой архив.