Node.js Потоки: обработка больших данных по частям

Что такое потоки?

Представьте, что вы смотрите видео на YouTube. Видео не загружается полностью перед воспроизведением. Сначала загружаются первые секунды, и воспроизведение начинается. Затем, по мере загрузки, отображается остальная часть видео. Node.js позволяет работать с данными аналогичным образом. Вместо того, чтобы обрабатывать огромный объект целиком, мы можем обрабатывать его по частям, что значительно увеличивает скорость передачи данных. Пользователь начинает видеть контент практически мгновенно, не дожидаясь полной загрузки.

Работа с файлами: чтение потоками

Рассмотрим пример построчного чтения большого текстового файла. Чтение по частям удобнее, чем чтение всего файла сразу. Для работы с потоками используем модуль fs.

Создание потока чтения:

Создадим переменную myReadStream с помощью метода fs.createReadStream. Этот метод позволяет читать файл по частям:

const fs = require('fs');
const myReadStream = fs.createReadStream('./article.txt'); // путь к файлу

Обработка событий:

Метод createReadStream автоматически включает обработчик событий. Используем событие ‘data’, срабатывающее при получении нового фрагмента данных (чанка):

myReadStream.on('data', chunk => {
    console.log('Новые данные получены:\n', chunk);
});

chunk — фрагмент данных, полученный из файла. Он выводится в консоль. Для корректного отображения кириллицы укажите кодировку: fs.createReadStream(‘./article.txt’, { encoding: ‘utf8’ }).

Работа с файлами: запись потоками

Научимся записывать данные в файл по частям.

Создание потока записи:

Создадим переменную myWriteStream для записи в файл с помощью метода fs.createWriteStream. Укажем кодировку utf8 и имя файла:

const myWriteStream = fs.createWriteStream('./news.txt', { encoding: 'utf8' });

Запись данных:

Перенаправим считанные чанки из myReadStream в myWriteStream:

myReadStream.on('data', chunk => {
    myWriteStream.write(chunk);
    console.log('Новые данные получены');
});

Каждый полученный чанк данных будет записываться в файл news.txt.

Использование потоков оптимизирует передачу данных, предоставляя пользователю доступ к контенту по частям, без ожидания полной загрузки. Это особенно эффективно при работе с большими файлами. Мы научились читать и записывать данные потоками, используя модуль fs и обработчики событий.

Что будем искать? Например,программа