Nem blokkoló I/O (Java) - Non-blocking I/O (Java)
A java.nio (a NIO jelentése nem blokkoló I/O) a Java programozási nyelvű API-k gyűjteménye , amelyek funkciókat kínálnak az intenzív I/O műveletekhez. A J2SE 1.4 Java kiadásával a Sun Microsystems vezette be, hogy kiegészítse a meglévő szabványos I/O -t . A NIO -t a Java közösségi folyamat keretében fejlesztették ki JSR 51. A NIO kiterjesztése, amely új fájlrendszer API -t kínál, NIO.2 néven, megjelent a Java SE 7 -el ("Dolphin").
Jellemzők és szervezés
Az NIO API-jait úgy tervezték, hogy hozzáférést biztosítsanak a modern operációs rendszerek alacsony szintű I/O műveleteihez. Bár az API-k önmagukban viszonylag magas szintűek, a cél egy olyan megvalósítás megkönnyítése, amely közvetlenül felhasználhatja az alapul szolgáló platform leghatékonyabb műveleteit.
A Java NIO API -k a java.niocsomagban és az alcsomagokban találhatók. Az Oracle dokumentációja azonosítja ezeket a funkciókat.
- Pufferek primitív típusú adatokhoz
- Karakterkészlet -kódolók és dekódolók
- Minta -illesztési lehetőség Perl -stílusú reguláris kifejezéseken (csomagban
java.util.regex) - Csatornák, új primitív I/O absztrakció
- A fájl interfész, amely támogatja a zárak és leképzési fájl legfeljebb
Integer.MAX_VALUEbájt (2 GiB ) - Egy multiplexelt , nem blokkoló I/O lehetőség skálázható szerverek írására
NIO pufferek
A NIO adatátvitel a puffereken ( java.nio.Bufferés a kapcsolódó osztályokon) alapul. Ezek az osztályok a memória szomszédos kiterjedését képviselik, kis számú adatátviteli művelettel együtt. Bár elméletileg ezek általános célú adatstruktúrák, a megvalósítás kiválaszthat memóriát az igazítási vagy lapozási jellemzőkhöz, amelyek egyébként nem érhetők el a Java-ban. Általában ezt arra használják, hogy a puffertartalom ugyanazt a fizikai memóriát foglalja el, amelyet az alap operációs rendszer használ a natív I/O műveletekhez, ezáltal lehetővé téve a legközvetlenebb átviteli mechanizmust, és szükségtelenné téve a további másolást. A legtöbb operációs rendszerben, feltéve, hogy a memória adott területe megfelelő tulajdonságokkal rendelkezik, az átvitel történhet a CPU használata nélkül. Az NIO puffer szándékosan korlátozott funkciókkal rendelkezik ezeknek a céloknak a támogatása érdekében.
A Java összes primitív típusához vannak pufferosztályok boolean, kivéve azokat , amelyek megoszthatják a memóriát a bájtpufferekkel, és lehetővé teszik a mögöttes bájtok tetszőleges értelmezését.
Használat
A NIO pufferek számos mutatót tartanak fenn, amelyek diktálják a hozzáférési módszereik funkcióját. Az NIO puffer implementációja gazdag módszert tartalmaz ezeknek a mutatóknak a módosítására:
- A
flip()módszer, ahelyett végző „flip” vagy lapozás funkció a kanonikus értelemben, mozgatja a helyzetben mutatót az eredetét a mögöttes tömb (ha van ilyen), és a határérték mutatót a korábbi pozícióját a pozíció mutatót. - Három
get()módszer létezik az adatok NIO -pufferből történő átvitelére. A tömeges megvalósítás ahelyett, hogy a hagyományos értelemben vett "get" -et hajtaná végre, "berakja" az adatokat egy meghatározott tömbbe. Az ehhez a módszerhez mellékelt "eltolás" argumentum nem a puffer belsejéből való eltolódásra utal, ahonnan ki kell olvasni, és nem a pozíciómutató eltolására , hanem inkább a 0 tömbön belüli eltolásra. - Kivéve, ha az abszolútumot
get()és aput()módszereket használja, bármelyikget()vagyput()a pozíciómutatóból történik . Ha egy másik pozícióból kell olvasni az alapul szolgáló tömbön belül, miközben nem kell módosítani az írás pozícióját, akkor amark()és areset()módszereket adtuk meg. - A
mark()módszer hatékonyan tárolja a helyzet a pozíció mutató beállítása a jelet mutató helyzetét a pozíció mutató. Azreset()eljárás hatására a pozíció mutatót mozgatni a védjegy mutató helyzetét. - Amikor hívása a
clear()módszer vagy aflip()módszer a jelet mutató eldobjuk. - A
clear()módszer nem biztosítja a nulla-nek a puffer, de nem tér vissza a határérték mutatót a felső határ az alapul szolgáló tömb, és a helyzetét mutató nullára. -
put()ésget()a NIO pufferek műveletei nem menetesek. - Csak
map()ajava.nio.MappedByteBuffer-tól ajava.nio.channels.FileChannel-igInteger.MAX_VALUEméretű (2GiB); az ezen a határon túli régiókhoz nullánál nagyobb eltolással lehet hozzáférni.
Csatornák
A csatornákat ( az interfészt megvalósító osztályokatjava.nio.channels.Channel ) úgy tervezték, hogy tömeges adatátvitelt biztosítsanak a NIO pufferekbe és azokból. Ez egy alacsony szintű adatátviteli mechanizmus, amely párhuzamosan létezik a magasabb szintű I/O könyvtár osztályaival (csomagok java.ioés java.net). A csatorna végrehajtására lehet beszerezni egy magas szintű adatátviteli osztályba, például java.io.File, java.net.ServerSocketvagy java.net.Socket, és fordítva. A csatornák analógok a Unix-szerű operációs rendszerekben található " fájlleírókkal ".
A fájlcsatornák ( java.nio.channels.FileChannel) tetszőleges puffereket használhatnak, de létrehozhatnak egy puffert, amely közvetlenül a fájl tartalmához van hozzárendelve memórialeképezett fájl használatával . A fájlrendszer zárolásával is kölcsönhatásba léphetnek . Hasonlóképpen, az aljzatcsatornák ( java.nio.channels.SocketChannelés java.nio.channels.ServerSocketChannel) lehetővé teszik az adatátvitelt a foglalatok és a NIO pufferek között.
FileChannelfájlmásoláshoz használható, amely potenciálisan sokkal hatékonyabb, mint a régi olvasás/írás bájt tömbvel. Ennek tipikus kódja a következő:
// Getting file channels
try(FileChannel in = FileChannel.open(source, StandardOpenOption.READ);
FileChannel out = FileChannel.open(target, StandardOpenOption.WRITE)
){
// JavaVM does its best to do this as native I/O operations.
in.transferTo(0, in.size(), out);
}
Választók
A választó ( java.nio.channels.Selectorés alosztályok) mechanizmust biztosít a csatornákon való várakozáshoz és annak felismeréséhez, hogy egy vagy több adat elérhetővé válik -e. Ha számos csatornát regisztrál a választógombbal, az lehetővé teszi a programfolyamat blokkolását mindaddig, amíg legalább egy csatorna készen áll a használatra, vagy amíg megszakítás nem következik be.
Bár ezt a multiplexelési viselkedést szálakkal is meg lehetne valósítani, a választó jelentősen hatékonyabb megvalósítást biztosíthat alacsonyabb szintű operációs rendszer konstrukciók használatával. Egy POSIX -kompatibilis operációs rendszer például közvetlenül ábrázolja ezeket a fogalmakat, válassza a () lehetőséget . Ennek a kialakításnak a figyelemre méltó alkalmazása lenne a szerver szoftver általános paradigmája, amely magában foglalja a válaszok egyidejű várakozását számos ülésen.
Karakterkészletek
Java nyelven a karakterkészlet leképezés az Unicode karakterek (vagy azok egy részhalmaza) és a bájtok között. A java.nio.charsetNIO csomag lehetőséget biztosít a karakterkészletek azonosítására, valamint kódolási és dekódolási algoritmusok biztosítására az új leképezésekhez.
Recepció
Váratlan, hogy egy Java IO RandomAccess fájlhoz társított csatorna megszakításkor bezárja a fájlleírót, míg a RandomAccessFiles saját olvasási módszere ezt nem teszi meg.
JDK 7 és NIO.2
A JDK 7 olyan java.nio.filecsomagot tartalmaz , amely az Pathosztályával (szintén újdonság a JDK 7 -ben), többek között kiterjesztett képességeket biztosít a fájlrendszeri feladatokhoz, pl. Képes szimbolikus / merev linkekkel dolgozni, és a nagy könyvtárakat a pufferekbe gyorsabban dobja, mint a régi fájl osztály igen. A java.nio.filecsomag és a hozzá tartozó csomag java.nio.file.attributeátfogó támogatást nyújt a fájl I/O és a fájlrendszer eléréséhez. Zip fájlrendszer -szolgáltató is elérhető a JDK 7 -ben.
Hivatkozások
- ^ "Javítások a Java I/O -ban" . Oracle Java dokumentáció . Letöltve: 2017. június 8 .
- ^ "JSR 51: Új I/O API -k a JavaTM platformhoz" . A Java közösségi folyamat (SM) program - JSR: Java Specification Requests . Letöltve: 2009-05-23 .
- ^ "Ez a JSR a Java SE 7" Dolphin "része lesz." "JSR 203: További új I/O API -k a JavaTM platformhoz (" NIO.2 ")" . A Java közösségi folyamat (SM) program - JSR: Java Specification Requests . 2006-01-30 . Letöltve: 2009-05-23 .
- ^ Ne tételezd fel, hogy tudod, mi a legjobb , Shawn Pearce, a Gerrit (szoftver) szerzője, 2010-05-14.
Külső linkek
- Java SE 10 API Javadocs
- JDK 5.0 Új I/O -hoz kapcsolódó API -k és fejlesztői útmutatók - az Oracle Corporation új I/O leírása
- Ismerje meg a Java SE 7 | A NIO 2 jellemzői
- JSR 51 (NIO)
- JSR 203 (NIO.2)
- Egy nagymértékben skálázható NIO -alapú szerver architektúrája - vita a Java NIO -ról és a használati mintákról
- Java NIO bemutató
- A Rox Java NIO bemutatója
- Skálázható IO Java nyelven (PDF)