Буфер¶
Буфер представляет собой некоторую область памяти, которая используется для временного хранения потоков данных операций ввода/вывода, в частности это касается файловой системы и работы с сетью.
В 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); //