Používanie Java MappedByteBuffer

1. Prehľad

V tomto rýchlom článku sa pozrieme na MappedByteBuffer v java.nio balíček. Tento nástroj môže byť veľmi užitočný na efektívne čítanie súborov.

2. Ako MappedByteBuffer Worky

Keď načítame oblasť súboru, môžeme ju načítať do konkrétnej oblasti pamäte, ku ktorej je možné získať prístup neskôr.

Keď vieme, že si budeme musieť prečítať obsah súboru viackrát, je dobré optimalizovať nákladný proces napr. uložením tohto obsahu do pamäte. Vďaka tomu bude následné vyhľadávanie tejto časti súboru smerovať iba do hlavnej pamäte bez potreby načítania údajov z disku, čím sa podstatne zníži latencia.

Jedna vec, s ktorou musíme byť pri používaní opatrní MappedByteBuffer je to, keď pracujeme s veľmi veľkými súbormi z disku - musíme sa uistiť, že sa súbor zmestí do pamäte.

V opačnom prípade môžeme zaplniť celú pamäť a v dôsledku toho naraziť na spoločné OutOfMemoryException. To môžeme prekonať načítaním iba časti súboru - napríklad na základe vzorcov používania.

3. Čítanie súboru pomocou MappedByteBuffer

Povedzme, že máme súbor s názvom fileToRead.txt s nasledujúcim obsahom:

Toto je obsah súboru

Súbor sa nachádza v priečinku / zdroj adresár, aby sme ho mohli načítať pomocou nasledujúcej funkcie:

Cesta getFileURIFromResources (reťazec fileName) vyvolá výnimku {ClassLoader classLoader = getClass (). GetClassLoader (); návrat Paths.get (classLoader.getResource (fileName) .getPath ()); }

Ak chcete vytvoriť MappedByteBuffer zo súboru, najskôr musíme vytvoriť a FileChannel od toho. Keď máme náš kanál vytvorený, môžeme vyvolať mapa () metóda na ňom prechádzajúca v MapMode, a pozíciu z ktorého chceme čítať, a veľkosť parameter, ktorý určuje, koľko bajtov chceme:

CharBuffer charBuffer = null; Cesta pathToRead = getFileURIFromResources ("fileToRead.txt"); try (FileChannel fileChannel (FileChannel) Files.newByteChannel (pathToRead, EnumSet.of (StandardOpenOption.READ))) {MappedByteBuffer mappedByteBuffer = fileChannel .map (FileChannel.MapMode.READ_ONLY, 0, fileCannel, 0, fileChannel) if (mappedByteBuffer! = null) {charBuffer = Charset.forName ("UTF-8"). decode (mappedByteBuffer); }}

Keď sme náš súbor namapovali do vyrovnávacej pamäte namapovanej na pamäť, môžeme z neho načítať údaje do súboru CharBuffer. Je dôležité si uvedomiť, že hoci čítame obsah súboru, keď voláme dekódovať () absolvovanie metódy MappedByteBuffer, čítame z pamäte, nie z disku. Preto bude toto čítanie veľmi rýchle.

Môžeme tvrdiť, že obsah, ktorý čítame z nášho súboru, je skutočným obsahom fileToRead.txt spis:

assertNotNull (charBuffer); assertEquals (charBuffer.toString (), "Toto je obsah súboru");

Každé ďalšie prečítanie z mappedByteBuffer bude veľmi rýchle, pretože obsah súboru je mapovaný v pamäti a čítanie sa deje bez nutnosti vyhľadávať údaje z disku.

4. Zápis do súboru pomocou MappedByteBuffer

Povedzme, že chceme do súboru zapísať nejaký obsah fileToWriteTo.txt pomocou MappedByteBuffer API. Aby sme to dosiahli, musíme otvoriť FileChannel a zavolajte na mapa () metóda na ňom, odovzdanie FileChannel.MapMode.READ_WRITE.

Ďalej môžeme uložiť obsah CharBuffer do súboru pomocou put () metóda z MappedByteBuffer:

CharBuffer charBuffer = CharBuffer .wrap ("Toto sa zapíše do súboru"); Cesta pathToWrite = getFileURIFromResources ("fileToWriteTo.txt"); vyskúšajte (FileChannel fileChannel = (FileChannel) Files .newByteChannel (pathToWrite, EnumSet.of (StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING))) {MappedByteBuffer mappedByteBuffer = fileChannel_Recorder_appleChannel = dĺžka ()); if (mappedByteBuffer! = null) {mappedByteBuffer.put (Charset.forName ("utf-8"). encode (charBuffer)); }}

Môžeme tvrdiť, že skutočný obsah charBuffer bol zapísaný do súboru prečítaním jeho obsahu:

Zoznam fileContent = Files.readAllLines (pathToWrite); assertEquals (fileContent.get (0), "Toto sa zapíše do súboru");

5. Záver

V tomto rýchlom návode sme sa pozreli na MappedByteBuffer konštruovať z java.nio balíček.

Jedná sa o veľmi efektívny spôsob, ako čítať obsah súboru viackrát, pretože súbor je namapovaný do pamäte a následné načítania nemusia ísť zakaždým na disk.

Všetky tieto príklady a útržky kódu nájdete na GitHube - jedná sa o projekt Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


$config[zx-auto] not found$config[zx-overlay] not found