Node.js - Буферы: руковод для начинающих
Здравствуйте, будущие маги Node.js! Я рад быть вашим проводником в увлекательное путешествие в мир буферов Node.js. Как кто-то, кто teaches программирование уже много лет, я могу сказать, что буферы являются незаслуженно забытыми героями работы с данными в Node.js. Они могут показаться немного загадочными сначала, но к концу этого руководства вы будете управлять ими, как профи!
Что такое буферы?
Прежде чем мы углубимся в детали, давайте начнем с основ. Представьте, что вы пытаетесь переместить гору песка. Вы могли бы пытаться перемещать его 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