Vyrovnávací paměť je konkrétní místo v nezpracované paměti. Slouží jako dočasný úložný prostor pro nadbytečná binární data, která procesorová jednotka nemůže v daný okamžik přijmout.
Node.js obsahuje třídu Buffer. Dokáže pracovat s binárními daty při správě toků TCP (Transfer Control Protocol) a operacích čtení a zápisu v systému souborů.
Naučte se vytvářet, číst a měnit obsah vyrovnávací paměti.
Vytvoření vyrovnávací paměti
Chcete-li vytvořit vyrovnávací paměť v Node.js, použijete alloc() nebo z() metody. The alloc() metoda vytvoří nový buffer, přičemž jeho velikost při vytváření určí jako první a jediný požadovaný parametr. Je to užitečné, když nemáte žádná data k uložení v době vytváření vyrovnávací paměti.
Zadejte parametr velikosti vyrovnávací paměti v bajtech při vytváření vyrovnávací paměti pomocí alloc() metoda. Například:
konst buf = Buffer.alloc(8);
řídicí panel.log (buf);
// výstup:
Třída Buffer automaticky přidává nuly jako zástupné hodnoty pro nová data, když je vytvoříte pomocí alloc() metoda.
Třída Buffer vyjadřuje každou hodnotu 0 jako 00pomocí hexadecimálního formátu. V tomto příkladu obsahuje celkem osm hodnot.
Chcete-li inicializovat vyrovnávací paměť s různými zástupnými hodnotami, předejte sekundu vyplnit parametr:
konst buf_filled = Buffer.alloc(8, 5);
řídicí panel.log (buf_filled);
// výstup:
Tento objekt cituje část paměti, která uchovává 8 bajtů hodnoty 05. Všimněte si, že ačkoli jste předali číslo jako vyplnit parametr, buffery ukládají data pouze v binárním formátu.
Po přidělení paměti do vyrovnávací paměti zapište data voláním napsat() metoda:
konst buf = Buffer.alloc(8);
buf.write("proti", "utf-8");
řídicí panel.log (buf)
// výstup:
buf.write("va","utf-8");
řídicí panel.log (buf)
// výstup:
The napsat() metoda používá kódování znaků pro převod prvního parametru pomocí utf-8 a poté zapíše řetězec do Bufferu. Přidáním druhého znaku do řetězce se zaplní druhý bajt.
Chcete-li extrahovat data z existujících datových typů, jako jsou řetězce nebo pole, použijte z() metoda. Tato metoda vytváří vyrovnávací paměti z řetězců a polí.
Například:
// Tětiva
konst stringBuf = Buffer.from('tětiva')
řídicí panel.log (stringBuf)
// výstup:
// Pole
konst arrayBuf = Buffer.from([97, 114, 114, 97, 121], "hexadecimální")
řídicí panel.log (arrayBuf);
// výstup:
The z() metoda bere vstup jako svůj první parametr, vypočítá počet bajtů, které potřebuje k zakódování dat, a poté odešle výsledek do vyrovnávací paměti. Zadáním jiného formátu kódování jako druhého parametru můžete přepsat výchozí kódování (UTF-8).
Předávání čísel do z() způsob bude mít za následek chybu.
Čtení vyrovnávací paměti
Přestože jsou vyrovnávací paměti podobné polím, nelze měnit jejich velikost a poradí si s nimi binární počítačová data díky vestavěným metodám.
Třída Buffer nám umožňuje číst jednotlivé bajty jejích dat pomocí syntaxe hranatých závorek JavaScriptu.
Například:
konst myBuf = Buffer.from('Těžit');
řídicí panel.log(MyBuf[1]);
// výstup: 105řídicí panel.log(MyBuf[3]);
// výstup: 101
řídicí panel.log(MyBuf[5]);
// výstup: nedefinováno
Výše uvedený blok kódu využívá syntaxi hranatých závorek k získání hodnot prvního a třetího bajtu v jejich desítkové reprezentaci. Pokus o získání neplatného bajtu bude mít za následek nedefinováno chyba.
Pro přístup ke všem svým datům přichází třída Buffer s metodami toJSON() a toString(), které získávají obsah ve dvou různých formátech.
The toString() metoda vypíše řetězec jako obsah vyrovnávací paměti:
konst myBuf = Buffer.from('Těžit');
řídicí panel.log(myBuf.toString());
// výstup: 'Můj'konst numberBuf = Buffer.from([123]);
řídicí panel.log(čísloBuf.toString())
// výstup: '{'
konst emptyBuf = Buffer.alloc(5);
řídicí panel.log(prázdnýBuf.toString());
// výstup: '\\x00\\x00\\x00\\x00\\x00'
První volání inicializuje vyrovnávací paměť s hodnotou „těžit“, které volání toString replikuje. Druhý příklad používá pro inicializaci jednointové pole, které má řetězcovou reprezentaci jako „{“ znak. V posledním případě Buffer s pěti nulové hodnoty vrátí řetězec "\x00\x00\x00\x00\x00”. Řetězec \x00 je hexadecimální reprezentace null.
The toString() metoda vždy vypíše výsledek ve formátu řetězce, bez ohledu na to, jakým typem dat inicializujete Buffer.
The .toJSON() metoda vrací desítkovou reprezentaci dat Buffer, bez ohledu na data, která jste použili k inicializaci Bufferu.
Například:
konst myBuf = Buffer.from('Těžit');
řídicí panel.log(myBuf.toJSON());
// výstup: { typ: 'vyrovnávací paměť', údaje: [ 77, 105, 110, 101 ] }
Výstup JSON má a typ nemovitost s hodnotou Buffer k označení jeho původu. Jeho vlastnost data ukládá pole desetinných míst, která představují původní pole bajtů.
Úprava vyrovnávací paměti
Podobně jako při přístupu k jednotlivým bajtům vyrovnávací paměti můžete také upravit jednotlivé bajty obsahu vyrovnávací paměti pomocí syntaxe hranatých závorek.
Při použití syntaxe hranatých závorek ke změně jednotlivého obsahu můžete přiřadit pouze desetinnou reprezentaci hodnoty.
Například:
myBuf[0] = 70
řídicí panel.log(myBuf.toString())
// výstup: 'Fajn'
Protože vyrovnávací paměti jsou binární data, nelze určité části vyrovnávací paměti přiřadit řetězec. Pokud se pokusíte nastavit jednotlivý bajt na řetězec, Buffer jej převede na znak null.
Například:
myBuf[0] = 'F';
řídicí panel.log(myBuf.toString());
// výstup: '\\x00ine'
Případně můžete změnit celý obsah vyrovnávací paměti pomocí napsat() metoda.
Zvažte vložení indexu mimo délku vyrovnávací paměti. Místo vracení chyby Buffer ignoruje neplatný index a zachovává původní obsah Bufferu nedotčený.
Zkuste například nastavit pátý prvek myBuf na r prostřednictvím jeho desítkové reprezentace 114:
myBuf[4] = 114;
řídicí panel.log(myBuf.toString());
// výstup: 'Můj'
Všimněte si, že toString() metoda vrací stejnou hodnotu 'Těžit'.
Protože nemůžete změnit velikost vyrovnávací paměti, pokus o zapsání více dat, než je možné pojmout, bude mít za následek vyřazení nadbytečných dat. Například:
konst buf1 = Buffer.alloc(5)
buf1.write('číslo');
řídicí panel.log(buf1.toString())
// výstup: 'číslo'
Za použití toString() metoda pro potvrzení dat vyrovnávací paměti, vrátí "číslo" spíše než 'číslo'. Což je vložený argument uvnitř napsat() metoda.
Vyrovnávací paměti zapisují sériovým způsobem počínaje indexem nula. The napsat() metoda sériově přidává bajty do vyrovnávací paměti a přepisuje všechna předchozí data.
Například:
konst buf2 = Buffer.alloc(6);
buf2.write('člen');
řídicí panel.log(buf2.toString())
// výstup: 'člen'
buf2.write('Ahoj');
řídicí panel.log(buf2.toString());
// výstup: 'himber'
Výše uvedený kód vytvoří šestibajtovou vyrovnávací paměť a přidá řetězec „člen" k tomu pomocí napsat() metoda.
Poté aktualizuje vyrovnávací paměť novým obsahem, který zabírá méně místa v paměti než dřívější obsah.
Výsledkem je vytvoření nového řetězce s přepsáním prvních dvou bajtů a zbývajícími beze změny.
Mnoho rozhraní API a datových struktur používá vyrovnávací paměti
Nyní víte, jak vytvořit vyrovnávací paměť, zapisovat do ní, číst její obsah a upravovat ji vhodnými metodami.
Pro práci s třídou Node.js Buffer je k dispozici několik dalších metod.
Měli byste znát tyto metody a rozumět Bufferům, abyste pochopili, jak fungují různé koncepty, jako jsou proudy a systémy souborů.