Использование потоков (Streams) в NodeJS

Node.js включает встроенный модуль stream, который позволяет нам работать с потоковыми данными и создавать высокопроизводительные приложения.

Основные типы потоков внутри Node.js:

  • Readable: потоки, из которых можно считывать данные (например, fs.createReadStream());
  • Writable: потоки, в которые могут быть записаны данные (например, fs.createWriteStream());
  • Duplex: потоки, которые являются одновременно Readable и Writable (например, net.Socket);
  • Transform: потоки преобразования (Duplex).

Readable Stream

Readable stream  - это абстракция определенного источника, из которого считываются данные (например, файла). 

Примеры readable streams в приложениях Node.js:

Чтение данных из Readable Streams в Node.js 

После подключения readable stream к источнику данных (например, файлу) можно использовать несколько способов считывания данных через поток:

Прослушивание событий "data" Readable Stream

Функция readDataFromFile() читает содержимое файла fileToRead.txt, расположенного в папке '__dirname/files', с помощью Readable Stream и выводит в консоль

Другие события Readable Stream  'close', 'end', 'error''pause''readable''resume'

Свойство { highWaterMark: 20 }, передаваемое в качестве опции в fs.createReadStream(), определяет размер чанка (chunk) данных (буфер внутри потока). По умолчанию у fs readable stream потоков, доступных для чтения, highWaterMark установлено на 64 кБ. 

Ниже, для примера, простое чтение и вывод в консоль (в process.stdout) с иcпользованием промиса функции pipeline(), которая обеспечивает соединение нескольких потоков, передачу ошибок между потоками и генераторами, правильную очистку и обратный вызов после завершения передачи:

[свернуть]
Использование асинхронных итераторов

Использование асинхронных итераторов является альтернативным способом чтения данных из readable stream .

[свернуть]

О контроле состояния потока readable stream в Node.js  читай на Хабре.

Writable Streams в Node.js 

Для записи данных из приложения в определенное место назначения (например, в файл) используются writable streams.

Примеры writable streams в Node.js:

Поток process.stdout может использоваться для записи данных в терминал и используется внутри console.log.

Фyнкция, которая записывает данные process.stdin в содержимое файла, используя Writable Stream

Функция, которая записывает данные, вводимые в консоли (process.stdin), в содержимое файла fileToWrite.txt , используя Writable Stream:

[свернуть]
Использование RedableStream и WritableStream при сжатии (распаковке) файлов

Функция, которая сжимает файл по адресу FILE_PATH в архив с адресом ARCHIVE_PATH с использованием zlib и Streams API:

Функция, которая распаковывает архив с адресом ARCHIVE_PATH в файл, расположенный по адресу FILE_PATH, с использованием zlib и Streams API:

[свернуть]

Transform Streams в Node.js

Transform stream реализует соединение readable stream и writable stream через transform stream, что позволяет преобразовать чанк (chank) данных после получения из readable stream и далее отправить его в writable stream.

Для преобразования порции данных (chank) используется приватный метод _transform класса Transform. Этот метод принимает 3 параметра:

  1. chunk (часть данных);
  2. encoding (кодировка, если chunk - это строка);
  3. callback(err, data) (функция, которая вызывается после неудачной или успешной записи).
Пример Transform Stream в Node.js

Функция, которая считывает строку из process.stdin, переворачивает текст с помощью Transform Stream и затем записывает его в process.stdout

 

[свернуть]

 

 

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.