Skip to main content

Що таке Readable stream?

Readable Stream у Node.js - це один із типів потоків (streams), призначений для читання даних із джерела частинами, а не цілком. Він дозволяє працювати з великими файлами чи потоками даних (наприклад, HTTP-запитами, сокетами, файловими потоками) без завантаження всього вмісту в пам'ять.

Основна ідея

Замість того щоб отримати всі дані одразу, Readable Stream видає їх порціями (chunks). Це робить обробку даних:

  • ефективнішою за пам'яттю - особливо під час роботи з великими файлами;
  • асинхронною - дані читаються в міру їхнього надходження.

Приклади Readable Stream у Node.js

Деякі вбудовані об'єкти вже реалізують інтерфейс Readable Stream:

  • fs.createReadStream() - читання файлів;
  • http.IncomingMessage - тіло вхідного HTTP-запиту чи відповіді;
  • process.stdin - стандартне введення;
  • net.Socket - сокети TCP.

Режими роботи Readable Stream

Readable Stream може працювати в двох режимах:

  1. Flowing mode (потоковий) Дані автоматично читаються й одразу надходять в обробники події data.
javascript
const fs = require('fs'); const stream = fs.createReadStream('file.txt', 'utf8'); stream.on('data', chunk => { console.log('Отримано шматок даних:', chunk); }); stream.on('end', () => { console.log('Читання завершено'); });
  1. Paused mode (призупинений) Потік чекає, поки ти викличеш .read() вручну.
javascript
const fs = require('fs'); const stream = fs.createReadStream('file.txt', 'utf8'); stream.on('readable', () => { let chunk; while ((chunk = stream.read()) !== null) { console.log('Прочитано chunk:', chunk); } });

Важливі події Readable Stream

ПодіяОпис
dataВикликається під час отримання чергового шматка даних
endПотік завершено, даних більше немає
errorПомилка під час читання
closeПотік остаточно закрито
readableМожна викликати read() - дані готові

Pipe (перенаправлення потоку)

Одне з найпотужніших застосувань - передача даних напряму в Writable Stream:

javascript
const fs = require('fs'); const readable = fs.createReadStream('input.txt'); const writable = fs.createWriteStream('output.txt'); readable.pipe(writable);

pipe() автоматично керує потоком - читає рівно стільки, скільки встигає записуватися в інший потік.

Переваги Readable Streams

  • Асинхронність (не блокує event loop)
  • Низьке споживання пам'яті
  • Можливість ланцюжків (pipe())
  • Підтримка backpressure (керування швидкістю передачі даних)

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.