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

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

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

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

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

javascriptreadableStream.pipe(writeableStream);
Задание 1

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

Цепочки

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

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

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

javascriptimport { createGzip } from 'zlib';

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

javascriptreadableStream.pipe(createGzip()).pipe(writeableStream);
Задание 2

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