Java MappedByteBuffer használata

1. Áttekintés

Ebben a gyors cikkben megnézzük a MappedByteBuffer ban,-ben java.nio csomag. Ez a segédprogram nagyon hasznos lehet a fájlok hatékony olvasásához.

2. Hogyan MappedByteBuffer Workok

A fájl egy régiójának betöltésekor betölthetjük azt a memóriaterületet, amelyhez később hozzáférhetünk.

Amikor tudjuk, hogy egy fájl tartalmát többször is el kell olvasnunk, célszerű optimalizálni a költséges folyamatot pl. a tartalom memóriába mentésével. Ennek köszönhetően a fájl ezen részének későbbi keresései csak a fő memóriába kerülnek, anélkül, hogy be kellene tölteni az adatokat a lemezről, ezzel jelentősen csökkentve a késést.

Egy dologra vigyáznunk kell a MappedByteBuffer amikor nagyon nagy fájlokkal dolgozunk lemezről - meg kell győződnünk arról, hogy a fájl elfér-e a memóriában.

Ellenkező esetben kitölthetjük a teljes memóriát, és ennek következtében belefuthatunk a közösbe OutOfMemoryException. Ezt leküzdhetjük, ha a fájlnak csak egy részét töltjük be - például használati minták alapján.

3. Olvassa el a fájlt a MappedByteBuffer

Tegyük fel, hogy van egy fájlunk fileToRead.txt a következő tartalommal:

Ez a fájl tartalma

A fájl a /forrás könyvtárat, így a következő függvény segítségével tölthetjük be:

A getFileURIFromResources (String fileName) elérési út dobja a {ClassLoader classLoader = getClass (). Kivételt. GetClassLoader (); return Paths.get (classLoader.getResource (fájlNév) .getPath ()); }

A MappedByteBuffer fájlból, először létre kell hoznunk a FileChannel ebből. Miután létrehoztuk a csatornánkat, meghívhatjuk a térkép() módszer rajta halad a MapMode, a pozíció ahonnan olvasni akarunk, és a méret paraméter, amely meghatározza, hogy hány bájtra van szükségünk:

CharBuffer charBuffer = null; Elérési útvonalToRead = getFileURIFromResources ("fileToRead.txt"); próbálkozzon (FileChannel fileChannel (FileChannel) Files.newByteChannel (pathToRead, EnumSet.of (StandardOpenOption.READ))) {MappedByteBuffer mappedByteBuffer = fileChannel .map (FileChannel.MapMode.READ_ONLY if (mappedByteBuffer! = null) {charBuffer = Charset.forName ("UTF-8"). dekódolás (mappedByteBuffer); }}

Miután feltöltöttük a fájlunkat a memória leképezett pufferbe, beolvashatjuk a belőle származó adatokat a CharBuffer. Fontos megjegyezni, hogy bár olvasjuk a fájl tartalmát, amikor a dekódolni () módszer átadása MappedByteBuffer, memóriából olvasunk, nem a lemezről. Ezért az olvasás nagyon gyors lesz.

Azt állíthatjuk, hogy a fájlunkból olvasott tartalom a fileToRead.txt fájl:

assertNotNull (charBuffer); assertEquals (charBuffer.toString (), "Ez a fájl tartalma");

Minden további olvasmány a mappedByteBuffer nagyon gyors lesz, mert a fájl tartalma leképeződik a memóriában, és az olvasás anélkül történik, hogy adatokat kellene keresni a lemezről.

4. Írás a fájlba a következővel: MappedByteBuffer

Tegyük fel, hogy valamilyen tartalmat be akarunk írni a fájlba fileToWriteTo.txt használni a MappedByteBuffer API. Ennek eléréséhez meg kell nyitnunk a FileChannel és felhívja a térkép() módszer rajta, átadva a FileChannel.MapMode.READ_WRITE.

Ezután elmenthetjük a CharBuffer a fájlba a put () módszer a MappedByteBuffer:

CharBuffer charBuffer = CharBuffer .wrap ("Ez a fájlba lesz írva"); Elérési útvonal pathToWrite = getFileURIFromResources ("fileToWriteTo.txt"); próbálkozzon (FileChannel fileChannel = [FileChannel] Fájlok .newByteChannel (pathToWrite, EnumSet.of (StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING)) {MappedByteBuffer File FilePlay.Fájlkezelő hossz()); if (mappedByteBuffer! = null) {mappedByteBuffer.put (Charset.forName ("utf-8"). kódolás (charBuffer)); }}

Azt állíthatjuk, hogy a charBuffer a fájl tartalmának elolvasásával íródott:

List fileContent = Files.readAllLines (pathToWrite); assertEquals (fileContent.get (0), "Ez be lesz írva a fájlba");

5. Következtetés

Ebben a gyors bemutatóban a MappedByteBuffer konstruálni a java.nio csomag.

Ez egy nagyon hatékony módszer a fájl tartalmának többszöri elolvasására, mivel a fájl leképeződik a memóriába, és az ezt követő olvasásoknak nem kell minden alkalommal lemezre menniük.

Mindezek a példák és kódrészletek megtalálhatók a GitHub-on - ez egy Maven-projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.