Кіріспе
Java. nio (NIO – New Input/Output) – Java бағдарламалау тілінің API-лерінің жиынтығы, ол интенсивті I/O операциялары үшін мүмкіндіктер ұсынады. Ол Sun Microsystems компаниясының Java J2SE 1.4 нұсқасымен бірге енгізілді, бұрынғы стандартты I/O-ны толықтыру мақсатында. NIO, Java Community Process аясында JSR 51 ретінде әзірленді. Java SE 7 ("Dolphin") нұсқасымен бірге жаңа файлдық жүйе API-ін ұсынатын NIO.2 деп аталатын кеңейту жарық көрді.
NIO буферлері
NIO деректерді беру буферлерге (және олармен байланысты кластарға) негізделген. Бұл кластар деректерді беру операцияларының шағын санымен бірге жадтың үздіріліссіз бөлігін көрсетеді. Теориялық тұрғыдан алғанда, бұл жалпы мақсаттағы деректер құрылымдары болғанымен, іске асыру Java-да басқаша қолжетімді емес, сәйкестендіру немесе беттестіру сипаттамалары үшін жадты таңдауы мүмкін. Әдетте, мұндай жағдай буфердің мазмұнына негізгі операциялық жүйенің өз туа біткен I/O операциялары үшін пайдаланатын физикалық жадтың бір бөлігін бөлуге мүмкіндік беру үшін қолданылады, бұл ең тікелей беру механизмін қамтамасыз етеді және қосымша көшіру қажеттілігін жояды. Көптеген операциялық жүйелерде, егер жадтың белгілі бір аймағы қажетті қасиеттерге ие болса, CPU-ны пайдаланбастан деректерді беру мүмкін. NIO буфері осы мақсаттарды қолдау үшін қасақана түрде мүмкіндіктері шектелген. Бульдік типтен басқа, Java-ның барлық қарапайым типтері үшін буферлік кластар бар, олар байт буферлерімен жадыны бөлісе алады және негізгі байттарды кез келген түрде түсіндіруге мүмкіндік береді.
Қолданылуы
NIO буферлері олардың қолжеткіш әдістерінің жұмысын анықтайтын бірнеше нұсқауштарды сақтайды. NIO буферін іске асыруда осы нұсқауштарды өзгерту үшін әдістердің кең жиынтығы бар: flip әдісі, канондық мағынада "айналдыру" немесе беттеу функциясын орындаудың орнына, позиция нұсқаушын негізгі массивтің бастапқы нүктесіне (бар болса) және лимит нұсқаушын позиция нұсқаушының бұрынғы орнына жылжытады. NIO буферінен деректерді алу үшін үш get әдісі ұсынылады. Көлемдік іске асыру, дәстүрлі мағынада "алуды" орындаудың орнына, деректерді белгіленген массивке "салады". Бұл әдіске берілген "офсет" аргументі буфердің ішіндегі оқуға арналған ауытқуды немесе позиция нұсқаушына ауытқуды емес, мақсатты массивтің ішіндегі 0-ден ауытқуды білдіреді. Абсолютті get және put әдістерін қолданбаған жағдайда, кез келген get немесе put позиция нұсқаушынан жүргізіледі. Егер жазу орнын өзгертусіз, негізгі массивтің басқа орнынан оқу қажет болса, mark және reset әдістері ұсынылған. mark әдісі позиция нұсқаушының орнын mark нұсқаушыға орнату арқылы тиімді түрде сақтайды. reset әдісі позиция нұсқаушыны mark нұсқаушының орнына жылжытады. clear әдісі немесе flip әдісі шақырылған кезде mark нұсқаушы жойылады. clear әдісі буферді нөлге келтіруді қамтамасыз етпейді, бірақ лимит нұсқаушын негізгі массивтің жоғарғы шегіне және позиция нұсқаушын нөлге қайтарады. NIO буферлері үшін put және get операциялары жиекке қауіпсіз емес. Сіз тек Integer.MAX_VALUE (2GiB) көлеміне дейін көшіре аласыз; осы шектен тыс аймақтарға нөлден жоғары офсетті пайдалану арқылы қол жеткізуге болады.
The flip method, rather than performing a "flip" or paging function in the canonical sense, moves the position pointer to the origin of the underlying array (if any) and the limit pointer to the former position of the position pointer. Three get methods are supplied for transferring data out of a NIO buffer. The bulk implementation, rather than performing a "get" in the traditional sense, "puts" the data into a specified array. The "offset" argument supplied to this method refers not to the offset from within the buffer from which to read, nor an offset from the position pointer, but rather the offset from 0 within the target array. Unless using the absolute get and put methods, any get or put is conducted from the position pointer. Should one need to read from a different position within the underlying array, whilst not adjusting the writing position, the mark and reset methods have been supplied. The mark method effectively stores the position of the position pointer by setting the mark pointer to the position of the position pointer. The reset method causes the position pointer to move to the mark pointer's position. Upon invocation of the clear method or the flip method the mark pointer is discarded. The clear method does not ensure zero ing of the buffer, but does return the limit pointer to the upper boundary of the underlying array, and the position pointer to zero. put and get operations for NIO buffers are not thread safe. You can only map a from a up to Integer. MAX VALUE in size (2GiB); regions beyond this limit can be accessed using an offset greater than zero.
Селекторлар
Селектор (және түйіндемелер) арналарда күту механизмін ұсынады және деректерді жіберу үшін бір немесе бірнеше арна қолжетімді болғанда анықтайды. Егер бірнеше арна селекторда тіркелген болса, ол кем дегенде бір арна пайдалануға дайын болғанға дейін немесе үзіліс жағдайы туғанға дейін бағдарлама ағынын тоқтатуға мүмкіндік береді. Бұл мультиплекстеу мүмкіндігі жіптер арқылы іске асырылғанымен, селектор төменгі деңгейдегі операциялық жүйе құрылымдарын пайдаланып әлдеқайда тиімді іске асыруды қамтамасыз ете алады. Мысалы, POSIX стандатына сәйкес келетін операциялық жүйеде осы ұғымдардың тікелей көрінісі болады, select. Осы дизайнның маңызды қолданылуы – серверлік бағдарламалық құралдарда кең таралған бірнеше сессиядан бір уақытта жауап күту парадигмасы.
Таңбалар жиынтығы
Java-да, таңбалар жиынтығы – Юникод таңбаларының (немесе олардың бір бөлігінің) байттармен байланыстырылуы. NIO пакелі жаңа байланыстар үшін таңбалар жиынтығын анықтауға және кодтау мен декодтау алгоритмдерін ұсынуға мүмкіндік береді.
Қабылдау
Java IO RandomAccess файлымен байланысты арнаның үзіліс кезінде файл дескрипторын жабуы күтпеген нәрсе, ал RandomAccessFiles-тің өзіндік оқу әдісі осылай жасамайды.
JDK 7 және NIO.2
JDK 7 пакетіне кіреді, ол жаңа класымен (сонымен қатар JDK 7-ге жаңа қосылған) файлдық жүйе тапсырмаларына кеңейтілген мүмкіндіктер береді, мысалы, символдық/қатты сілтемелермен жұмыс істей алады және ескі File класынан гөрі үлкен каталогтар тізімдерін буферлерге жылдам құюға болады. Пакет және оған байланысты пакеті файлдық I/O және файлдық жүйеге қол жеткізу үшін жан-жақты қолдау көрсетеді. JDK 7-де zip файлдық жүйе провайдері де қол жетімді. java.nio.file.LinkOption интерфейстер арқылы кеңейтілетін enum-дарды эмуляциялаудың мысалы. Java-да бір Enum екінші Enum-нан мұрагерлікке ие бола алмайды. Дегенмен, Enum бір немесе бірнеше интерфейсті жүзеге асыру арқылы кеңейтілетін Enum түрін эмуляциялауға болады. LinkOption – OpenOption және CopyOption интерфейстерін жүзеге асыратын Enum түрі, ол кеңейтілетін Enum түрінің әсерін эмуляциялайды. Бұл тәсілдің бір кемшілігі – әртүрлі Enum типтері арасында жүзеге асырулар мұрагерлікке ие бола алмайды.