Node.js - Буферы: руковод для начинающих

Здравствуйте, будущие маги Node.js! Я рад быть вашим проводником в увлекательное путешествие в мир буферов Node.js. Как кто-то, кто teaches программирование уже много лет, я могу сказать, что буферы являются незаслуженно забытыми героями работы с данными в Node.js. Они могут показаться немного загадочными сначала, но к концу этого руководства вы будете управлять ими, как профи!

Node.js - Buffers

Что такое буферы?

Прежде чем мы углубимся в детали, давайте начнем с основ. Представьте, что вы пытаетесь переместить гору песка. Вы могли бы пытаться перемещать его grain за grainом, но это заняло бы вечность! Вместо этого вы бы использовали ведро. В мире Node.js буферы resemble те ведра - они помогают нам эффективно обрабатывать и перемещать двоичные данные.

Буферы - это фиксированные по размеруchunks памяти, выделенные вне JavaScript-движка V8. Они особенно полезны при работе с такими вещами, как операции с файлами, сетевые протоколы или любые сценарии, где вам нужно работать с потоками двоичных данных.

Создание буфера

Давайте начнем с создания нашего первого буфера:

const buf1 = Buffer.alloc(10);
console.log(buf1);

Когда вы выполните этот код, вы увидите что-то вроде этого:

<Buffer 00 00 00 00 00 00 00 00 00 00>

Что только что произошло? Мы создали буфер размером 10 байтов, и все байты инициализированы нулями. Это как если бы мы только что получили новое ведро, чистое и пустое, готовое быть заполненным нашими данными-песком!

Теперь давайте создадим буфер с�始альным содержимым:

const buf2 = Buffer.from('Hello, Node.js!');
console.log(buf2);

Вывод:

<Buffer 48 65 6c 6c 6f 2c 20 4e 6f 64 65 2e 6a 73 21>

Здесь мы создали буфер из строки. Each число, которое вы видите, represents ASCII-код для каждого символа в нашей строке. Круто, правда?

Статические методы

Node.js предоставляет несколько статических методов для работы с буферами. Давайте рассмотрим некоторые из самых commonly используемых:

Buffer.alloc()

Мы уже видели этот метод в действии. Он создает новый буфер указанного размера, с всеми байтами, инициализированными нулями.

const buf3 = Buffer.alloc(5);
console.log(buf3); // <Buffer 00 00 00 00 00>

Buffer.from()

Этот метод создает новый буфер из массива, другого буфера или строки.

const buf4 = Buffer.from([1, 2, 3, 4, 5]);
console.log(buf4); // <Buffer 01 02 03 04 05>

const buf5 = Buffer.from('Hello');
console.log(buf5); // <Buffer 48 65 6c 6c 6f>

Buffer.concat()

Этот метод объединяет список буферов.

const buf6 = Buffer.from('Hello');
const buf7 = Buffer.from(' World');
const buf8 = Buffer.concat([buf6, buf7]);
console.log(buf8.toString()); // Hello World

Вот таблица, резюмирующая эти статические методы:

Метод Описание Пример
Buffer.alloc() Создает новый буфер указанного размера Buffer.alloc(10)
Buffer.from() Создает буфер из массива, буфера или строки Buffer.from('Hello')
Buffer.concat() Объединяет список буферов Buffer.concat([buf1, buf2])

Методы справки

Теперь, когда мы создали наши буферы, давайте рассмотрим некоторые методы, которые мы можем использовать для работы с ними.

buf.toString()

Этот метод декодирует буфер в строку в соответствии с указанным кодированием символов.

const buf9 = Buffer.from('Hello, Buffer!');
console.log(buf9.toString()); // Hello, Buffer!
console.log(buf9.toString('hex')); // 48656c6c6f2c2042756666657221

buf.write()

Этот метод записывает строку в буфер.

const buf10 = Buffer.alloc(20);
buf10.write('Hello');
console.log(buf10.toString()); // Hello

buf.slice()

Этот метод возвращает новый буфер, который ссылается на ту же память, что и оригинал, но использует указанные вами начальный и конечный индексы.

const buf11 = Buffer.from('Hello, Buffer!');
const slicedBuf = buf11.slice(0, 5);
console.log(slicedBuf.toString()); // Hello

Вот таблица, резюмирующая эти методы:

Метод Описание Пример
buf.toString() Декодирует буфер в строку buf.toString()
buf.write() Записывает строку в буфер buf.write('Hello')
buf.slice() Возвращает новый буфер, ссылающийся на ту же память buf.slice(0, 5)

Методы класса

Наконец, давайте рассмотрим некоторые методы класса, которые могут быть особенно полезны при работе с буферами.

Buffer.isBuffer()

Этот метод проверяет, является ли объект буфером.

const buf12 = Buffer.from('Hello');
console.log(Buffer.isBuffer(buf12)); // true
console.log(Buffer.isBuffer('Not a buffer')); // false

Buffer.byteLength()

Этот метод возвращает количество байтов в строке или буфере.

console.log(Buffer.byteLength('Hello')); // 5
console.log(Buffer.byteLength('?')); // 4 (потому что этот смайлик занимает 4 байта)

Вот таблица, резюмирующая эти методы класса:

Метод Описание Пример
Buffer.isBuffer() Проверяет, является ли объект буфером Buffer.isBuffer(obj)
Buffer.byteLength() Возвращает количество байтов в строке или буфере Buffer.byteLength('Hello')

И вот оно,folks! Мы прошли через землю буферов Node.js, от их создания до манипулирования их содержимым. Помните, что практика делает perfect. Так что не бойтесь экспериментировать с этими методами и видеть, что вы можете создать.

За годы преподавания я понял, что лучший способ真正做到 понимание буферов - это использовать их в реальных проектах. Попробуйте прочитать файл в буфер или отправить данные буфера по сети. Чем больше вы их используете, тем естественнее они станут.

Before I sign off, here's a little Buffer joke for you: Why did the Buffer cross the road? To get to the other byte! (I know, I know, I should stick to coding...)

Счастливого кодирования, и пусть ваши буферы всегда будут полны именно тех данных, которые вам нужны!

Credits: Image by storyset