Ситуация, в которой нам нужно прочитать данные из одного потока и записать их в другой, является достаточно распространенной. Для упрощения такой операции придуманы каналы (англ. 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
файлов. Напишите код, который
зархивирует каждый из этих файлов в свой архив.