Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке Writable stream?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Writable Stream** - потік у Node.js, призначений для запису даних частинами (chunk-ами) у певний цільовий ресурс: файл, мережеве з'єднання, HTTP-відповідь, stdout тощо; якщо Readable - джерело даних, то Writable - приймач. **Ключове:** `.write()` повертає `false`, коли внутрішній буфер переповнений - це сигнал призупинити читання й дочекатися події `drain`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**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 | ## Приклад запису у файл ```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)Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.