Буферът е конкретно място в необработената памет. Той служи като временно място за съхранение на излишните двоични данни, които процесорът не може да приеме в този конкретен момент.
Node.js включва буферен клас. Може да работи с двоични данни, когато управлява TCP (Transfer Control Protocol) потоци и операции за четене и запис на файлова система.
Научете как да създавате, четете и променяте съдържанието на буфер.
Създаване на буфер
За да създадете буфер в Node.js, ще използвате разпределяне () или от() методи. The разпределяне () метод създава нов буфер, като посочва неговия размер по време на създаването като първия и единствен задължителен параметър. Полезно е, когато нямате данни за съхранение по време на създаването на буфера.
Задайте параметъра за размера на буфера в байтове, когато създавате буфер с разпределяне () метод. Например:
конст buf = Buffer.alloc(8);
конзола.log (buf);
// изход:
Класът Buffer автоматично добавя нули като заместващи стойности за нови данни, когато ги създавате с разпределяне () метод.
Класът Buffer изразява всяка стойност 0 като 00, използвайки шестнадесетичен формат. В този пример той съдържа общо осем стойности.
За да инициализирате буфера с различни стойности на контейнери, пропуснете секунда запълвам параметър:
конст buf_filled = Buffer.alloc(8, 5);
конзола.log (buf_filled);
// изход:
Този обект цитира част от паметта, която съхранява 8 байта от стойността 05. Имайте предвид, че въпреки че сте предали число като запълвам параметър, буферите съхраняват данни само в двоичен формат.
След като разпределите паметта на буфера, запишете данни, като извикате пиши() метод:
конст buf = Buffer.alloc(8);
buf.write("v", "utf-8");
конзола.log (buf)
// изход:
buf.write("ва","utf-8");
конзола.log (buf)
// изход:
The пиши() методът използва кодиране на знаци за преобразуване на първия параметър, използвайки utf-8 и след това записва низа в буфера. Добавянето на втори знак към низа ще запълни втория байт.
За да извлечете данни от съществуващи типове данни като низове или масиви, използвайте от() метод. Този метод създава буфери от низове и масиви.
Например:
// Низ
конст stringBuf = Buffer.from("низ")
конзола.log (stringBuf)
// изход:
// Масив
конст arrayBuf = Buffer.from([97, 114, 114, 97, 121], шестнадесетичен)
конзола.log (arrayBuf);
// изход:
The от() методът приема входа като първи параметър, изчислява броя байтове, необходими за кодиране на данните, и след това изпраща резултата до буфера. Като предоставите друг формат на кодиране като втори параметър, можете да замените кодирането по подразбиране (UTF-8).
Предаване на номера към от() метод ще доведе до грешка.
Четене на буфер
Въпреки че буферите са подобни на масиви, те не могат да променят размера си и могат да се справят с тях двоични компютърни данни благодарение на вградените методи.
Класът Buffer ни позволява да четем отделни байтове от неговите данни, използвайки синтаксиса на квадратни скоби на JavaScript.
Например:
конст myBuf = Buffer.from('Моята');
конзола.дневник(MyBuf[1]);
// изход: 105конзола.дневник(MyBuf[3]);
// изход: 101
конзола.дневник(MyBuf[5]);
// изход: недефиниран
Кодовият блок по-горе използва синтаксиса на квадратните скоби, за да получи стойностите на първия и третия байт в тяхното десетично представяне. Опитът за получаване на невалиден байт ще доведе до недефиниран грешка.
За достъп до всички свои данни класът Buffer идва с методи toJSON() и toString(), които получават съдържанието в два различни формата.
The toString() метод извежда низ като съдържание на буфера:
конст myBuf = Buffer.from('Моята');
конзола.дневник(myBuf.toString());
// изход: 'Мое'конст numberBuf = Buffer.from([123]);
конзола.дневник(numberBuf.toString())
// изход: '{'
конст празенBuf = Buffer.alloc(5);
конзола.дневник(празенБуф.toString());
// изход: '\\x00\\x00\\x00\\x00\\x00'
Първото извикване инициализира буфера със стойността „Моята”, което извикването на toString репликира. Вторият пример използва единичен int масив за инициализация, който има низово представяне като „{” характер. В крайния случай, буфер с пет нулеви стойности връща низа "\x00\x00\x00\x00\x00”. Низът \x00 е шестнадесетичното представяне на нула.
The toString() винаги извежда резултата във формат на низ, без значение с какъв тип данни инициализирате буфера.
The .toJSON() връща десетичното представяне на данните от буфера, независимо от данните, които сте използвали за инициализиране на буфера.
Например:
конст myBuf = Buffer.from('Моята');
конзола.дневник(myBuf.toJSON());
// изход: { Тип: "Буфер", данни: [ 77, 105, 110, 101 ] }
Изходът на JSON има a Тип имот на стойност от Буфер за да посочи произхода му. Неговото свойство data съхранява масив от десетични знаци, които представляват оригиналния масив от байтове.
Модифициране на буфер
Подобно на достъпа до отделните байтове на буфер, можете също да промените отделни байтове от съдържанието на буфер, като използвате синтаксиса на квадратни скоби.
Когато използвате синтаксиса на квадратни скоби за промяна на отделно съдържание, можете да зададете само десетично представяне на стойността.
Например:
myBuf[0] = 70
конзола.дневник(myBuf.toString())
// изход: 'Добре'
Тъй като буферите са двоични данни, не можете да дадете низ на определена част от буфер. Ако се опитате да зададете отделен байт на низ, буферът ще го преведе в нулев знак.
Например:
myBuf[0] = "F";
конзола.дневник(myBuf.toString());
// изход: '\\x00ine'
Като алтернатива можете да промените цялото съдържание на буфер, като използвате пиши() метод.
Помислете за вмъкване на индекс извън дължината на буфера. Вместо да връща грешка, Buffer игнорира невалидния индекс и запазва оригиналното съдържание на Buffer непокътнато.
Например, опитайте се да зададете петия елемент на myBuf да се r чрез неговото десетично представяне на 114:
myBuf[4] = 114;
конзола.дневник(myBuf.toString());
// изход: 'Мое'
Забележете, че toString() метод връща същата стойност 'Моята'.
Тъй като не можете да промените размера на буфер, опитът да запишете повече данни, отколкото можете да поберете, ще доведе до изхвърляне на допълнителните данни. Например:
конст buf1 = Buffer.alloc(5)
buf1.write("номер");
конзола.дневник(buf1.toString())
// изход: 'numbe'
Използвайки toString() метод за потвърждаване на буферните данни, той се връща "numbe" отколкото „номер“. Което е вмъкнатият аргумент вътре в пиши() метод.
Буферите записват по сериен начин, започвайки от индекс нула. The пиши() метод последователно добавя байтове към буфер, презаписвайки всички предишни данни.
Например:
конст buf2 = Buffer.alloc(6);
buf2.write('член');
конзола.дневник(buf2.toString())
// изход: 'член'
buf2.write("здравей");
конзола.дневник(buf2.toString());
// изход: 'himber'
Кодът по-горе създава шестбайтов буфер и добавя низа „член" към него с помощта на пиши() метод.
След това актуализира буфера с ново съдържание, което заема по-малко място в паметта от предишното съдържание.
Това води до създаването на нов низ, като първите два байта са презаписани, а останалите байтове остават непроменени.
Много API и структури от данни използват буфери
Сега знаете как да създадете буфер, да пишете в него, да прочетете съдържанието му и да го модифицирате с подходящите методи.
Има няколко други налични метода за работа с буферния клас Node.js.
Трябва да знаете тези методи и да разбирате буферите, за да разберете как работят различни концепции като потоци и файлови системи.