Skip to main content
Практика завдань

Що таке buffer в Node.js?

Буфери в Node.js

Буфер — це фіксований обсяг пам'яті, виділений поза купою V8, який використовується для роботи з бінарними даними безпосередньо. Буфери є необхідними при роботі з потоками, введенням/виведенням файлів, мережевими протоколами та перетвореннями кодування.


Чому буфери?

Рядки JavaScript є UTF-16, що добре підходить для тексту, але є витратними для бінарних даних (зображення, файли, TCP-пакети). Буфери представляють сирі бінарні дані у вигляді послідовності байтів.


Створення буферів

js
// З рядка const buf1 = Buffer.from('Hello, Node.js!', 'utf8'); // З масиву байтів const buf2 = Buffer.from([72, 101, 108, 108, 111]); // Виділення безпечного (нульового) буфера const buf3 = Buffer.alloc(10); // 10 байтів, всі нулі // Виділення неініціалізованого (швидше, але може містити старі дані) const buf4 = Buffer.allocUnsafe(10); // використовуйте з обережністю! // З шістнадцяткового рядка const buf5 = Buffer.from('48656c6c6f', 'hex');

Читання та запис

js
const buf = Buffer.alloc(4); // Запис байтів buf.writeUInt8(0x48, 0); // 'H' buf.writeUInt8(0x69, 1); // 'i' // Читання байтів console.log(buf[0]); // 72 console.log(buf.toString('utf8')); // 'Hi' // Інспекція console.log(buf.length); // 4 console.log(buf); // <Buffer 48 69 00 00>

Підтримка кодування

js
const buf = Buffer.from('Hello'); buf.toString('utf8'); // 'Hello' buf.toString('hex'); // '48656c6c6f' buf.toString('base64'); // 'SGVsbG8=' buf.toString('ascii'); // 'Hello'

Різання та копіювання

js
const buf = Buffer.from('Hello, World!'); // slice посилається на ту ж пам'ять const slice = buf.slice(0, 5); console.log(slice.toString()); // 'Hello' // copy створює новий буфер const copy = Buffer.alloc(5); buf.copy(copy, 0, 0, 5); console.log(copy.toString()); // 'Hello' // Сучасний: subarray (те ж саме, що і slice) const sub = buf.subarray(7, 12); console.log(sub.toString()); // 'World'

Буфери в потоках

js
const fs = require('fs'); fs.createReadStream('./image.png').on('data', (chunk) => { // chunk є буфером console.log(`Отримано ${chunk.length} байтів`); });

Буфер vs TypedArray

З моменту Node.js 4, Buffer є підкласом Uint8Array. Ви можете використовувати методи TypedArray на буфері:

js
const buf = Buffer.from([1, 2, 3, 4, 5]); const arr = new Uint8Array(buf); // Вони ділять ту ж пам'ять

Резюме

Буфер = сирі бінарні дані в пам'яті поза V8. Використовуйте його при обробці бінарних протоколів, введення/виведення файлів, шифруванні, стисненні або будь-яких даних, які не є простим текстом. Завжди вказуйте кодування при перетворенні між буфером і рядком.

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

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

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

Дочитали статтю?
Практика завдань