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

Буфер

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

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

Создание

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

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

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

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

1
2
let buffer = Buffer.alloc(3);
buffer.length; //3

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

1
2
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(), который принимает строку и создает под нее буфер.

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

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

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

Запись

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

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

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

1
2
3
4
5
6
7
//Запись в пустой буфер
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>

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

1
2
3
4
5
6
7
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() возвращает длину записанной в буфер строки.

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

Чтение

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

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

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

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

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

Buffer API

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

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

1
Buffer.isEncoding('ascii'); //true

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

1
Buffer.isBuffer('ascii'); //false

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

1
2
Buffer.byteLength('ascii'); // 5
Buffer.byteLength('ascii', 'base64'); //

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

1
2
3
4
let buffer1 = Buffer.from('ABC');
let buffer2 = Buffer.from('CDE');
Buffer.conact([buffer1, buffer2], 5); //
Buffer.conact([buffer1, buffer2], 7); //