Що таке buffer в Node.js?
Буфери в Node.js
Буфер — це фіксований обсяг пам'яті, виділений поза купою V8, який використовується для роботи з бінарними даними безпосередньо. Буфери є необхідними при роботі з потоками, введенням/виведенням файлів, мережевими протоколами та перетвореннями кодування.
Чому буфери?
Рядки JavaScript є UTF-16, що добре підходить для тексту, але є витратними для бінарних даних (зображення, файли, TCP-пакети). Буфери представляють сирі бінарні дані у вигляді послідовності байтів.
Створення буферів
// З рядка
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');Читання та запис
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>Підтримка кодування
const buf = Buffer.from('Hello');
buf.toString('utf8'); // 'Hello'
buf.toString('hex'); // '48656c6c6f'
buf.toString('base64'); // 'SGVsbG8='
buf.toString('ascii'); // 'Hello'Різання та копіювання
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'Буфери в потоках
const fs = require('fs');
fs.createReadStream('./image.png').on('data', (chunk) => {
// chunk є буфером
console.log(`Отримано ${chunk.length} байтів`);
});Буфер vs TypedArray
З моменту Node.js 4, Buffer є підкласом Uint8Array. Ви можете використовувати методи TypedArray на буфері:
const buf = Buffer.from([1, 2, 3, 4, 5]);
const arr = new Uint8Array(buf);
// Вони ділять ту ж пам'ятьРезюме
Буфер = сирі бінарні дані в пам'яті поза V8. Використовуйте його при обробці бінарних протоколів, введення/виведення файлів, шифруванні, стисненні або будь-яких даних, які не є простим текстом. Завжди вказуйте кодування при перетворенні між буфером і рядком.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.