Що таке 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 може працювати в двох режимах:
- Flowing mode (потоковий)
Дані автоматично читаються й одразу надходять в обробники події
data.
const fs = require('fs');
const stream = fs.createReadStream('file.txt', 'utf8');
stream.on('data', chunk => {
console.log('Отримано шматок даних:', chunk);
});
stream.on('end', () => {
console.log('Читання завершено');
});- Paused mode (призупинений)
Потік чекає, поки ти викличеш
.read()вручну.
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:
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 (керування швидкістю передачі даних)
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.