Korištenje Jave MappedByteBuffer

1. Pregled

U ovom ćemo kratkom članku pogledati MappedByteBuffer u java.nio paket. Ovaj uslužni program može biti vrlo koristan za učinkovito čitanje datoteka.

2. Kako MappedByteBuffer Worke

Kada učitavamo područje datoteke, možemo ga učitati u određeno područje memorije kojem se može pristupiti kasnije.

Kad znamo da ćemo sadržaj datoteke trebati pročitati više puta, dobra je ideja optimizirati skupi postupak, npr. spremanjem tog sadržaja u memoriju. Zahvaljujući tome, naknadno pretraživanje tog dijela datoteke ići će samo u glavnu memoriju, bez potrebe za učitavanjem podataka s diska, značajno smanjujući kašnjenje.

Jedna stvar s kojom moramo biti oprezni kada koristimo MappedByteBuffer je kada radimo s vrlo velikim datotekama s diska - moramo biti sigurni da će datoteka stati u memoriju.

Inače možemo napuniti cijelu memoriju i kao posljedicu naletjeti na zajedničko OutOfMemoryException. To možemo prevladati učitavanjem samo dijela datoteke - na primjer na temelju obrazaca korištenja.

3. Čitanje datoteke pomoću MappedByteBuffer

Recimo da imamo datoteku koja se zove fileToRead.txt sa sljedećim sadržajem:

Ovo je sadržaj datoteke

Datoteka se nalazi u /resurs direktorij kako bismo ga mogli učitati pomoću sljedeće funkcije:

Put getFileURIFromResources (Niz datotekeName) baca izuzetak {ClassLoader classLoader = getClass (). GetClassLoader (); vratiti Paths.get (classLoader.getResource (ime datoteke) .getPath ()); }

Da biste stvorili MappedByteBuffer iz datoteke, prvo moramo stvoriti FileChannel iz toga. Nakon što stvorimo kanal, možemo se pozvati na karta() metoda na njemu prelazeći u MapMode, a položaj iz kojega želimo čitati i veličina parametar koji specificira koliko bajtova želimo:

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

Jednom kada smo preslikali svoju datoteku u memorirani međuspremnik, možemo pročitati podatke iz nje u CharBuffer. Važno je napomenuti da iako čitamo sadržaj datoteke kada zovemo dekodiraj () metoda prolaska MappedByteBuffer, čitamo iz memorije, a ne s diska. Stoga će to čitanje biti vrlo brzo.

Možemo ustvrditi da je sadržaj koji čitamo iz naše datoteke stvarni sadržaj fileToRead.txt datoteka:

assertNotNull (charBuffer); assertEquals (charBuffer.toString (), "Ovo je sadržaj datoteke");

Svako sljedeće čitanje iz mappedByteBuffer bit će vrlo brzo jer se sadržaj datoteke preslikava u memoriju i čitanje se vrši bez potrebe za pretraživanjem podataka s diska.

4. Zapisivanje u datoteku pomoću MappedByteBuffer

Recimo da u datoteku želimo upisati neki sadržaj fileToWriteTo.txt koristiti MappedByteBuffer API. Da bismo to postigli moramo otvoriti FileChannel i nazovite karta() metoda na njemu, prolazeći u FileChannel.MapMode.READ_WRITE.

Dalje, možemo spremiti sadržaj datoteke CharBuffer u datoteku pomoću staviti() metoda iz MappedByteBuffer:

CharBuffer charBuffer = CharBuffer .wrap ("Ovo će biti zapisano u datoteku"); Put pathToWrite = getFileURIFromResources ("fileToWriteTo.txt"); isprobajte (FileChannel fileChannel = (FileChannel) Datoteke .newByteChannel (pathToWrite, EnumSet.of (StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING))) {MappedByteBuffer mappedByteBuffERMapBafferManBafferManBafferManBaneMapEnFanel. duljina ()); if (mappedByteBuffer! = null) {mappedByteBuffer.put (Charset.forName ("utf-8"). encode (charBuffer)); }}

Možemo tvrditi da je stvarni sadržaj charBuffer je zapisano u datoteku čitanjem njezina sadržaja:

Popis fileContent = Files.readAllLines (pathToWrite); assertEquals (fileContent.get (0), "Ovo će biti zapisano u datoteku");

5. Zaključak

U ovom brzom vodiču gledali smo MappedByteBuffer konstruirati iz java.nio paket.

Ovo je vrlo učinkovit način za čitanje sadržaja datoteke više puta, jer se datoteka preslikava u memoriju, a naknadno čitanje ne mora svaki put ići na disk.

Svi ovi primjeri i isječci koda mogu se naći na GitHubu - ovo je Maven projekt, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.