Що таке Buffer у Node.js?
Buffer - це спеціальний тип даних у Node.js, призначений для роботи з бінарними (сирими) даними, тобто з послідовностями байтів, а не зі звичайними рядками чи об'єктами JavaScript.
1. Що таке Buffer простими словами
Коли Node.js працює з файлами, мережею, зображеннями, шифруванням та іншими низькорівневими I/O-операціями, він часто отримує не текст, а байти (нульові та одиничні значення).
Проблема: JavaScript спочатку (у браузері) не вміє працювати з бінарними даними напряму - у нього є лише рядки й об'єкти.
Рішення:
Node.js увів об'єкт Buffer - структуру, яка:
- зберігає послідовність байтів (raw data);
- дозволяє читати й записувати ці байти в різних форматах (UTF-8, Base64, HEX тощо);
- використовується в усіх I/O-операціях (файли, HTTP, TCP, streams).
2. Приклад використання Buffer
const buf = Buffer.from('Hello', 'utf8');
console.log(buf); // <Buffer 48 65 6c 6c 6f>
console.log(buf.toString()); // "Hello"Тут:
'Hello'- рядок,Buffer.from()- створив буфер із рядка,- усередині зберігаються байти (
0x48,0x65, ...), toString()перетворює байти назад у текст.
3. Де використовується Buffer
Node.js застосовує Buffer скрізь, де потрібно обробити двійкові дані:
| Приклад | Опис |
|---|---|
fs.readFile() | читає файл у Buffer |
http | тіло запиту чи відповіді надходить як потік байтів |
net.Socket | передача бінарних даних по TCP |
zlib, crypto | стиснення, шифрування |
stream | усі потоки читають/пишуть саме Buffer-об'єкти |
4. Основні способи створення Buffer
// 1. Створити буфер з рядка
const buf1 = Buffer.from('Node.js');
// 2. Створити буфер заданого розміру (порожній)
const buf2 = Buffer.alloc(10); // 10 байт, заповнено нулями
// 3. Створити небезпечний буфер (без обнулення)
const buf3 = Buffer.allocUnsafe(10); // швидше, але містить "сміття"
// 4. Створити з масиву чисел
const buf4 = Buffer.from([0x41, 0x42, 0x43]);
console.log(buf4.toString()); // "ABC"5. Читання й запис даних у Buffer
const buf = Buffer.alloc(4);
buf.writeUInt8(65, 0); // Записуємо число 65 (A) у байт №0
buf.writeUInt8(66, 1); // B
buf.writeUInt8(67, 2); // C
console.log(buf.toString('utf8')); // "ABC"Можна читати як числа, рядки, float, hex тощо.
6. Взаємодія з потоками
Під час читання файлу потік повертає дані у вигляді буферів:
const fs = require('fs');
const stream = fs.createReadStream('file.txt');
stream.on('data', chunk => {
console.log('Тип даних:', Buffer.isBuffer(chunk)); // true
console.log('Частина файлу:', chunk.toString());
});Кожен chunk - це Buffer, що представляє шматок файлу.
7. Робота з кодуваннями
Buffer підтримує різні кодування:
'utf8''ascii''base64''hex''latin1''utf16le'
const buf = Buffer.from('Привіт', 'utf8');
console.log(buf.toString('hex')); // hex-представлення тексту8. Чому Buffer важливий
| Перевага | Пояснення |
|---|---|
| Ефективність | Робота напряму з байтами без проміжних перетворень. |
| Низькорівнева інтеграція | Потрібен для взаємодії з ОС, мережею, файловою системою. |
| Сумісність | Універсальний формат обміну між потоками, HTTP, TCP тощо. |
9. Відмінність Buffer від Array чи String
| Властивість | Buffer | Array | String |
|---|---|---|---|
| Зберігає | байти | довільні значення | символи |
| Змінюваність | можна змінювати | можна змінювати | незмінна |
| Розмір | фіксований | динамічний | динамічний |
| Призначення | бінарні дані | логіка й обчислення | текст |
Підсумок
Bufferу Node.js - це об'єкт для роботи із сирими бінарними даними. Він використовується в усіх операціях введення-виведення (I/O) - файли, мережа, потоки - і дозволяє читати, записувати й перетворювати байти напряму, забезпечуючи високу продуктивність і низькорівневий контроль над даними.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.