Кіріспе

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) көлеміне дейін көшіре аласыз; осы шектен тыс аймақтарға нөлден жоғары офсетті пайдалану арқылы қол жеткізуге болады.

Селекторлар

Селектор (және түйіндемелер) арналарда күту механизмін ұсынады және деректерді жіберу үшін бір немесе бірнеше арна қолжетімді болғанда анықтайды. Егер бірнеше арна селекторда тіркелген болса, ол кем дегенде бір арна пайдалануға дайын болғанға дейін немесе үзіліс жағдайы туғанға дейін бағдарлама ағынын тоқтатуға мүмкіндік береді. Бұл мультиплекстеу мүмкіндігі жіптер арқылы іске асырылғанымен, селектор төменгі деңгейдегі операциялық жүйе құрылымдарын пайдаланып әлдеқайда тиімді іске асыруды қамтамасыз ете алады. Мысалы, 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 типтері арасында жүзеге асырулар мұрагерлікке ие бола алмайды.