Перейти к содержанию

Буфер

Буфер представляет собой некоторую область памяти, которая используется для временного хранения потоков данных операций ввода/вывода, в частности это касается файловой системы и работы с сетью.

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

Создание

Для создания пустого буфера размером в 10 байт используйте метод Buffer.alloc().

Buffer.alloc(10) //<Buffer 00 00 00 00 00 00 00 00 00 00>

После создания буфера его размер изменить нельзя.

Размер буфера хранится в свойстве length.

let buffer = Buffer.alloc(3)
buffer.length //3

Чтобы заполнить создаваемый буфера значением по умолчанию, просто передайте это значение Buffer.alloc() вторым параметром

Buffer.alloc(10, 'A') //<Buffer 41 41 41 41 41 41 41 41 41 41>
Buffer.alloc(10, 'ABC') //<Buffer 41 42 43 41 42 43 41 42 43 41>

Если передаваемое по умолчанию значение меньше размера самого буфера, то оно будет повторяться в нем, пока полностью его не заполнит.

Для создания буфера сразу нужного размера в Node.js имеется метод Buffer.from(), который принимает строку и создает под нее буфер.

Buffer.from('ABCDE') //<Buffer 41 42 43 44 45>

Вторым необязательным параметром методу Buffer.from() можно передать кодировку.

Buffer.from('ABCDE', 'base64') //<Buffer 00 10 83>

Запись

Чтобы записать данные в пустой или уже заполненный буфер, используйте метод [Buffer instance].write(), который принимает следующие параметры:

  • строку для записи;
  • позицию, с которой необходимо начать запись;
  • длину от изначальной строки, которую необходимо записать;
  • кодировку (по умолчанию utf8).

Обязательным аргументом является только строка для записи.

//Запись в пустой буфер
let buffer1 = Buffer.alloc(3) //<Buffer 00 00 00>
buffer1.write('ABC') //<Buffer 41 42 43>

//Перезапись заполненного буфера
let buffer2 = Buffer.from('ABC') //<Buffer 41 42 43>
buffer2.write('XYZ') //<Buffer 58 59 5a>

Пример записи в буфер с дополнительными параметрами.

let buffer = Buffer.alloc(3)

//сдвиг позиции
buffer.write('A', 1) //<Buffer 00 41 00>

//ограничение записи переданной строки
buffer.write('ABC', 0, 2) //<Buffer 41 42 00>

Метод [Buffer instance].write() возвращает длину записанной в буфер строки.

let buffer = Buffer.alloc(5)
console.log(buffer.write('ABC')) //3

Чтение

Для получения данных из буфера в том формате, в котором они в него заносились, в Node.js имеется метод [Buffer instance].toString(), принимающий следующие необязательные параметры:

  • кодировку (по умолчанию utf8);
  • позицию, с которой необходимо начать чтение;
  • позицию, на которой закончить чтение.
let buffer = Buffer.from('ABC')
buffer.toString() //ABC
buffer.toString('utf8', 1, 1) //B

Преобразование в JSON

Объект Node.js класса Buffer может быть преобразован в формат JSON с помощью метода [Buffer instance].toJSON().

let buffer = Buffer.from('ABC')
buffer.toJSON().data //[65, 66, 67]

Buffer API

В Node.js класс Buffer предоставляет ряд полезных методов, облегчающих работу с буфером:

Buffer.isEncoding() - принимает кодировку и возвращает true, если ее испольщование допустимо при работе с буфером;

Buffer.isEncoding('ascii') //true

Buffer.isBuffer() - принимает данные и возвращает true, если они являются экземпляром класса Buffer;

Buffer.isBuffer('ascii') //false

Buffer.byteLength() - возвращает длину переданной строки в байтах (это не то же самое, что количество символов в строке), вторым необязательным параметром можно передать кодировку;

Buffer.byteLength('ascii') // 5
Buffer.byteLength('ascii', 'base64') //

Buffer.concat() - принимает массив объектов класса Buffer и объединяет их в один, вторым необязательным параметром можно передать длину итогового буфера.

let buffer1 = Buffer.from('ABC')
let buffer2 = Buffer.from('CDE')
Buffer.conact([buffer1, buffer2], 5) //
Buffer.conact([buffer1, buffer2], 7) //