Skip to main content

Що таке 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.SocketTCP-сокет

Основні методи Writable Stream

МетодОпис
.write(chunk)Записує шматок даних (рядок чи Buffer)
.end([chunk])Завершує потік, можна передати останній chunk
.cork() / .uncork()Буферизує записи для підвищення продуктивності
.destroy([error])Перериває потік із помилкою
.pipe(destination)Використовується у Readable Stream, щоб спрямувати дані у Writable Stream

Приклад запису у файл

javascript
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:

javascript
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:

javascript
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)

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

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

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