Що таке Writable stream?
Writable Stream - це потік у Node.js, призначений для запису даних частинами (chunk-ами) у якийсь цільовий ресурс - наприклад, файл, мережеве з'єднання, HTTP-відповідь, stdout тощо.
Якщо Readable Stream - це джерело даних, то Writable Stream - приймач даних.
Основна ідея
Writable Stream дозволяє передавати дані поступово, без потреби тримати весь вміст у пам'яті. Це особливо важливо для:
- запису великих файлів,
- надсилання потокових відповідей HTTP,
- передачі даних мережею.
Приклади Writable Streams у Node.js
Деякі вбудовані об'єкти Node.js вже реалізують інтерфейс Writable Stream:
| Приклад | Опис |
|---|---|
fs.createWriteStream() | Запис у файл |
http.ServerResponse | Тіло HTTP-відповіді сервера |
process.stdout | Стандартне виведення |
net.Socket | TCP-сокет |
Основні методи Writable Stream
| Метод | Опис |
|---|---|
.write(chunk) | Записує шматок даних (рядок чи Buffer) |
.end([chunk]) | Завершує потік, можна передати останній chunk |
.cork() / .uncork() | Буферизує записи для підвищення продуктивності |
.destroy([error]) | Перериває потік із помилкою |
.pipe(destination) | Використовується у Readable Stream, щоб спрямувати дані у Writable Stream |
Приклад запису у файл
const fs = require('fs');
const stream = fs.createWriteStream('output.txt');
stream.write('Перший рядок\n');
stream.write('Другий рядок\n');
stream.end('Фінальний рядок\n'); // Закриває потікПодії Writable Stream
| Подія | Опис |
|---|---|
drain | Потік готовий прийняти нові дані після переповнення буфера |
finish | Потік завершив запис |
error | Помилка під час запису |
close | Потік остаточно закрито |
Механізм Backpressure (тиск потоку)
Коли Writable не встигає обробляти вхідні дані, він призупиняє читання з Readable.
Це робить метод .write() - він повертає:
true, якщо буфер вільний;false, якщо потік перевантажений.
Приклад із контролем backpressure:
const fs = require('fs');
const readable = fs.createReadStream('input.txt');
const writable = fs.createWriteStream('output.txt');
readable.on('data', (chunk) => {
if (!writable.write(chunk)) {
readable.pause(); // призупиняємо читання
}
});
writable.on('drain', () => {
readable.resume(); // відновлюємо, коли звільнився буфер
});
readable.on('end', () => writable.end());Робота через pipe()
Найчастіше Writable Stream використовується разом із Readable Stream:
const fs = require('fs');
const readable = fs.createReadStream('input.txt');
const writable = fs.createWriteStream('output.txt');
readable.pipe(writable);pipe() автоматично керує backpressure й потоками даних - це рекомендований спосіб з'єднувати їх.
Переваги Writable Streams
- Асинхронний і поетапний запис
- Мінімальне використання пам'яті
- Можливість об'єднання з Readable через
pipe() - Керування швидкістю потоку (backpressure)
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.