Bruke Java MappedByteBuffer

1. Oversikt

I denne raske artikkelen ser vi på MappedByteBuffer i java.nio pakke. Dette verktøyet kan være ganske nyttig for effektiv fillesing.

2. Hvordan MappedByteBuffer W.orker

Når vi laster inn en region av filen, kan vi laste den til det bestemte minneområdet som du kan få tilgang til senere.

Når vi vet at vi må lese innholdet i en fil flere ganger, er det lurt å optimalisere den kostbare prosessen, f.eks. ved å lagre det innholdet i minnet. Takket være det vil påfølgende oppslag av den delen av filen bare gå til hovedminnet uten å måtte laste inn data fra platen, noe som reduserer ventetiden betydelig.

En ting som vi må være forsiktige med når vi bruker MappedByteBuffer er når vi jobber med veldig store filer fra plate - vi må sørge for at filen passer i minnet.

Ellers kan vi fylle opp hele minnet og som en konsekvens kjøre inn i det vanlige OutOfMemoryException. Vi kan overvinne det ved å laste inn bare en del av filen - for eksempel basert på bruksmønstre.

3. Lese filen ved hjelp av MappedByteBuffer

La oss si at vi har en fil som heter fileToRead.txt med følgende innhold:

Dette er et innhold i filen

Filen ligger i /ressurs katalog slik at vi kan laste den ved hjelp av følgende funksjon:

Sti getFileURIFromResources (String fileName) kaster Unntak {ClassLoader classLoader = getClass (). GetClassLoader (); returner Paths.get (classLoader.getResource (filnavn) .getPath ()); }

Å lage MappedByteBuffer fra en fil, først må vi lage en FileChannel fra det. Når vi har opprettet kanalen vår, kan vi påberope oss kart() metoden på den passerer i MapMode, en posisjon som vi ønsker å lese, og størrelse parameter som spesifiserer hvor mange byte vi vil ha:

CharBuffer charBuffer = null; Path pathToRead = getFileURIFromResources ("fileToRead.txt"); prøv (FileChannel fileChannel (FileChannel) Files.newByteChannel (pathToRead, EnumSet.of (StandardOpenOption.READ))) {MappedByteBuffer mappedByteBuffer = fileChannel .map (FileChannel.MapMode.READ_ONLY, 0, fileChannel.size); hvis (mappedByteBuffer! = null) {charBuffer = Charset.forName ("UTF-8"). dekode (mappedByteBuffer); }}

Når vi har kartlagt filen vår i minnekartet buffer, kan vi lese dataene fra den i CharBuffer. Viktig å merke seg er at selv om vi leser innholdet i filen når vi ringer dekode() metode bestått MappedByteBuffer, vi leser fra minnet, ikke fra platen. Derfor vil den lese være veldig rask.

Vi kan hevde at innholdet vi leser fra filen vår er det faktiske innholdet i fileToRead.txt fil:

assertNotNull (charBuffer); assertEquals (charBuffer.toString (), "Dette er et innhold i filen");

Hver påfølgende lese fra mappedByteBuffer vil være veldig raskt fordi innholdet i filen er kartlagt i minnet og lesing er gjort uten å måtte slå opp data fra platen.

4. Skrive til filen ved hjelp av MappedByteBuffer

La oss si at vi vil skrive noe innhold i filen fileToWriteTo.txt bruker MappedByteBuffer API. For å oppnå det må vi åpne FileChannel og ring kart() metoden på den, passerer i FileChannel.MapMode.READ_WRITE.

Deretter kan vi lagre innholdet i CharBuffer inn i filen ved hjelp av sette() metoden fra MappedByteBuffer:

CharBuffer charBuffer = CharBuffer .wrap ("Dette vil bli skrevet til filen"); Path pathToWrite = getFileURIFromResources ("fileToWriteTo.txt"); prøv (FileChannel fileChannel = (FileChannel) filer .newByteChannel (pathToWrite, EnumSet.of (StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING))) {MappedByteBuffer mappedByteBufferapode. FileChannel. FileChannel. lengde()); hvis (mappedByteBuffer! = null) {mappedByteBuffer.put (Charset.forName ("utf-8"). kode (charBuffer)); }}

Vi kan hevde at det faktiske innholdet i charBuffer ble skrevet til filen ved å lese innholdet i den:

Liste fileContent = Files.readAllLines (pathToWrite); assertEquals (fileContent.get (0), "Dette vil bli skrevet til filen");

5. Konklusjon

I denne raske opplæringen så vi på MappedByteBuffer konstruere fra java.nio pakke.

Dette er en veldig effektiv måte å lese innholdet på filen flere ganger, da filen blir kartlagt i minnet og påfølgende lesinger ikke trenger å gå til platen hver gang.

Alle disse eksemplene og kodebitene finner du på GitHub - dette er et Maven-prosjekt, så det skal være enkelt å importere og kjøre som det er.


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