Čitatelia ako vy pomáhajú podporovať MUO. Keď uskutočníte nákup pomocou odkazov na našej stránke, môžeme získať pridruženú províziu. Čítaj viac.

Vyrovnávacia pamäť je špecifické miesto v surovej pamäti. Slúži ako dočasný úložný priestor pre nadbytočné binárne dáta, ktoré procesorová jednotka nemôže v danom momente prijať.

Node.js obsahuje triedu Buffer. Dokáže pracovať s binárnymi údajmi pri správe tokov TCP (Transfer Control Protocol) a operáciách čítania a zápisu v súborovom systéme.

Naučte sa vytvárať, čítať a meniť obsah vyrovnávacej pamäte.

Vytvorenie vyrovnávacej pamäte

Na vytvorenie vyrovnávacej pamäte v Node.js použijete alloc() alebo od () metódy. The alloc() metóda vytvorí nový buffer, pričom jeho veľkosť pri vytváraní určí ako prvý a jediný požadovaný parameter. Je to užitočné, keď nemáte žiadne údaje na uloženie v čase vytvárania vyrovnávacej pamäte.

Pri vytváraní vyrovnávacej pamäte pomocou súboru zadajte parameter veľkosti vyrovnávacej pamäte v bajtoch alloc() metóda. Napríklad:

instagram viewer
konšt buf = Buffer.alloc(8);
konzoly.log (buf);
// výkon:

Trieda Buffer automaticky pridáva nuly ako zástupné hodnoty pre nové údaje, keď ich vytvoríte pomocou alloc() metóda.

Trieda Buffer vyjadruje každú hodnotu 0 ako 00pomocou hexadecimálneho formátu. V tomto príklade obsahuje celkovo osem hodnôt.

Ak chcete inicializovať vyrovnávaciu pamäť s rôznymi zástupnými hodnotami, počkajte sekundu vyplniť parameter:

konšt buf_filled = Buffer.alloc(8, 5);
konzoly.log (buf_filled);
// výkon:

Tento objekt cituje časť v pamäti, ktorá uchováva 8 bajtov hodnoty 05. Všimnite si, že hoci ste prešli číslom ako vyplniť parameter, vyrovnávacie pamäte ukladajú dáta iba v binárnom formáte.

Po pridelení pamäte do vyrovnávacej pamäte zapíšte dáta volaním písať () metóda:

konšt buf = Buffer.alloc(8);

buf.write("v", "utf-8");
konzoly.log (buf)
// výkon:

buf.write("va","utf-8");
konzoly.log (buf)
// výkon:

The písať () metóda používa kódovanie znakov na konverziu prvého parametra pomocou utf-8 a potom zapíše reťazec do vyrovnávacej pamäte. Pridaním druhého znaku do reťazca sa zaplní druhý bajt.

Ak chcete extrahovať údaje z existujúcich typov údajov, ako sú reťazce alebo polia, použite príkaz od () metóda. Táto metóda vytvára vyrovnávacie pamäte z reťazcov a polí.

Napríklad:

// Reťazec
konšt stringBuf = Buffer.from('reťazec')
konzoly.log (stringBuf)
// výkon:

// Pole
konšt arrayBuf = Buffer.from([97, 114, 114, 97, 121], 'hex')
konzoly.log (arrayBuf);
// výkon:

The od () metóda vezme vstup ako svoj prvý parameter, vypočíta počet bajtov, ktoré potrebuje na zakódovanie údajov, a potom odošle výsledok do vyrovnávacej pamäte. Zadaním iného formátu kódovania ako druhého parametra môžete prepísať predvolené kódovanie (UTF-8).

Odovzdávanie čísel do od () spôsobí chybu.

Čítanie vyrovnávacej pamäte

Aj keď sú vyrovnávacie pamäte podobné poliam, nie je možné meniť ich veľkosť a dokážu si s nimi poradiť binárne počítačové dáta vďaka zabudovaným metódam.

Trieda Buffer nám umožňuje čítať jednotlivé bajty jej údajov pomocou syntaxe hranatých zátvoriek JavaScriptu.

Napríklad:

konšt myBuf = Buffer.from('moje');
konzoly.log(MyBuf[1]);
// výstup: 105

konzoly.log(MyBuf[3]);
// výstup: 101

konzoly.log(MyBuf[5]);
// výstup: nedefinovaný

Vyššie uvedený blok kódu využíva syntax hranatých zátvoriek na získanie hodnôt prvého a tretieho bajtu v ich desiatkovej reprezentácii. Pokus o získanie neplatného bajtu bude mať za následok nedefinované chyba.

Na prístup ku všetkým svojim údajom prichádza trieda Buffer s metódami toJSON() a natiahnuť(), ktoré získavajú obsah v dvoch rôznych formátoch.

The natiahnuť() metóda vypíše reťazec ako obsah vyrovnávacej pamäte:

konšt myBuf = Buffer.from('moje');
konzoly.log(myBuf.natiahnuť());
// výstup: 'Moje'

konšt numberBuf = Buffer.from([123]);
konzoly.log(čísloBuf.natiahnuť())
// výkon: '{'

konšt emptyBuf = Buffer.alloc(5);
konzoly.log(prázdnyBuf.natiahnuť());
// výstup: '\\x00\\x00\\x00\\x00\\x00'

Prvé volanie inicializuje vyrovnávaciu pamäť s hodnotou „Moje“, ktoré replikuje volanie toString. Druhý príklad používa na inicializáciu jednointové pole, ktoré má reťazcovú reprezentáciu ako „{“ znak. V konečnom prípade Buffer s piatimi nulové hodnoty vráti reťazec “\x00\x00\x00\x00\x00”. Reťazec \x00 je hexadecimálne vyjadrenie hodnoty null.

The natiahnuť() metóda vždy vypíše výsledok vo formáte reťazca, bez ohľadu na to, akým typom údajov inicializujete vyrovnávaciu pamäť.

The .toJSON() metóda vráti desiatkovú reprezentáciu údajov vyrovnávacej pamäte bez ohľadu na údaje, ktoré ste použili na inicializáciu vyrovnávacej pamäte.

Napríklad:

konšt myBuf = Buffer.from('moje');
konzoly.log(myBuf.toJSON());
// výkon: { typu: 'Buffer', údaje: [ 77, 105, 110, 101 ] }

Výstup JSON má a typu majetok s hodnotou Buffer na označenie jeho pôvodu. Jeho dátová vlastnosť ukladá pole desatinných miest, ktoré predstavujú pôvodné bajtové pole.

Úprava vyrovnávacej pamäte

Podobne ako pri prístupe k jednotlivým bajtom vyrovnávacej pamäte môžete tiež upraviť jednotlivé bajty obsahu vyrovnávacej pamäte pomocou syntaxe hranatých zátvoriek.

Pri použití syntaxe hranatých zátvoriek na zmenu jednotlivého obsahu môžete priradiť iba desatinné vyjadrenie hodnoty.

Napríklad:

myBuf[0] = 70
konzoly.log(myBuf.natiahnuť())
// výstup: 'Fajn'

Pretože vyrovnávacie pamäte sú binárne údaje, špecifickej časti vyrovnávacej pamäte nemôžete priradiť reťazec. Ak sa pokúsite nastaviť jednotlivý bajt na reťazec, Buffer ho preloží na nulový znak.

Napríklad:

myBuf[0] = 'F';
konzoly.log(myBuf.natiahnuť());
// výstup: '\\x00ine'

Prípadne môžete zmeniť celý obsah vyrovnávacej pamäte pomocou písať () metóda.

Zvážte vloženie indexu mimo dĺžky vyrovnávacej pamäte. Namiesto vrátenia chyby Buffer ignoruje neplatný index a zachová pôvodný obsah Bufferu nedotknutý.

Skúste napríklad nastaviť piaty prvok myBuf do r prostredníctvom jeho desatinného vyjadrenia 114:

myBuf[4] = 114;
konzoly.log(myBuf.natiahnuť());
// výstup: 'Moje'

Všimnite si, že natiahnuť() metóda vráti rovnakú hodnotu 'moje'.

Keďže nemôžete zmeniť veľkosť vyrovnávacej pamäte, pokus o zápis väčšieho množstva údajov, ako je možné pojať, bude mať za následok vyradenie nadbytočných údajov. Napríklad:

konšt buf1 = Buffer.alloc(5)
buf1.write('číslo');
konzoly.log(buf1.natiahnuť())
// výstup: 'číslo'

Pomocou natiahnuť() metóda na potvrdenie údajov vyrovnávacej pamäte, vráti sa "číslo" radšej než „číslo“. Čo je vložený argument vnútri písať () metóda.

Vyrovnávacie pamäte sa zapisujú sériovým spôsobom počínajúc indexom nula. The písať () metóda sériovo pridáva bajty do vyrovnávacej pamäte, pričom prepisuje všetky predchádzajúce údaje.

Napríklad:

konšt buf2 = Buffer.alloc(6);

buf2.write('člen');
konzoly.log(buf2.natiahnuť())
// výstup: 'člen'

buf2.write('Ahoj');
konzoly.log(buf2.natiahnuť());
// výstup: 'himber'

Vyššie uvedený kód vytvorí šesťbajtovú vyrovnávaciu pamäť a pridá reťazec „člen” k tomu pomocou písať () metóda.

Potom aktualizuje vyrovnávaciu pamäť novým obsahom, ktorý zaberá menej miesta v pamäti ako predchádzajúci obsah.

Výsledkom je vytvorenie nového reťazca, pričom prvé dva bajty budú prepísané a zvyšné bajty zostanú nezmenené.

Mnoho rozhraní API a dátových štruktúr používa vyrovnávacie pamäte

Teraz viete, ako vytvoriť vyrovnávaciu pamäť, zapisovať do nej, čítať jej obsah a upravovať ju vhodnými metódami.

Na prácu s triedou Node.js Buffer je k dispozícii niekoľko ďalších metód.

Mali by ste poznať tieto metódy a pochopiť vyrovnávacie pamäte, aby ste pochopili, ako fungujú rôzne koncepty, ako sú prúdy a systémy súborov.