Jump to content

Неблокирующий ввод-вывод (Java)

java.nio (NIO означает «Новый ввод/вывод»). [1] [2] ) — это набор языка программирования Java API-интерфейсов , которые предлагают функции для интенсивных операций ввода-вывода . Он был представлен J2SE в выпуске Java Sun Microsystems 1.4 в дополнение к существующему стандарту ввода-вывода. NIO был разработан в рамках процесса сообщества Java как JSR 51. [3] Расширение NIO, предлагающее новый API файловой системы под названием NIO.2, было выпущено вместе с Java SE 7 («Dolphin»). [4]

Особенности и организация

[ редактировать ]

API-интерфейсы NIO были разработаны для обеспечения доступа к низкоуровневым операциям ввода-вывода современных операционных систем. Хотя API-интерфейсы сами по себе являются относительно высокоуровневыми, их цель состоит в том, чтобы облегчить реализацию, которая может напрямую использовать наиболее эффективные операции базовой платформы.

API-интерфейсы Java NIO представлены в java.nio пакет и его подпакеты. В документации Oracle указаны эти функции.

NIO-буферы

[ редактировать ]

Передача данных NIO основана на буферах ( java.nio.Buffer и родственные классы). Эти классы представляют собой непрерывный объем памяти вместе с небольшим количеством операций передачи данных. Хотя теоретически это структуры данных общего назначения, реализация может выбирать память для характеристик выравнивания или подкачки, которые иначе недоступны в Java. Обычно это используется для того, чтобы позволить содержимому буфера занимать ту же физическую память, которая используется базовой операционной системой для ее собственных операций ввода-вывода, что обеспечивает наиболее прямой механизм передачи и устраняет необходимость в любом дополнительном копировании. В большинстве операционных систем, при условии, что конкретная область памяти имеет правильные свойства, передача может происходить вообще без использования ЦП. Буфер NIO намеренно ограничен в возможностях для достижения этих целей.

Существуют буферные классы для всех примитивных типов Java, кроме boolean, который может использовать память совместно с байтовыми буферами и допускать произвольную интерпретацию базовых байтов.

Использование

[ редактировать ]

Буферы NIO поддерживают несколько указателей, определяющих функции их методов доступа. Реализация буфера NIO содержит богатый набор методов для изменения этих указателей:

  • The flip() Вместо выполнения функции «переворота» или пейджинга в каноническом смысле перемещает указатель позиции в начало координат базового массива (если таковой имеется), а указатель предела — в предыдущую позицию указателя позиции .
  • Три get() предоставляются методы для передачи данных из буфера NIO. Массовая реализация вместо выполнения «получения» в традиционном смысле слова «помещает» данные в указанный массив. Аргумент «смещение», передаваемый этому методу, относится не к смещению внутри буфера, из которого выполняется чтение, и не к смещению от указателя позиции , а скорее к смещению от 0 внутри целевого массива.
  • Если не использовать абсолютный get() и put() методы, любые get() или put() осуществляется от указателя положения . Если нужно прочитать из другой позиции в базовом массиве, не меняя при этом позицию записи , mark() и reset() методы были предоставлены.
  • The mark() Метод эффективно сохраняет положение указателя позиции , устанавливая указатель метки в положение указателя позиции . reset() метод заставляет указатель положения перемещаться в метки . положение указателя
  • При вызове clear() метод или flip() метод, указатель метки отбрасывается.
  • The clear() Метод не обеспечивает обнуление буфера, но возвращает указатель предела на верхнюю границу базового массива, а указатель позиции — на ноль.
  • put() и get() операции для буферов NIO не являются потокобезопасными.
  • Вы можете только map() а java.nio.MappedByteBuffer из java.nio.channels.FileChannel до Integer.MAX_VALUE по размеру (2ГиБ); к регионам, выходящим за пределы этого предела, можно получить доступ, используя смещение больше нуля.

Каналы ( классы, реализующие интерфейс java.nio.channels.Channel) предназначены для обеспечения массовой передачи данных в буферы NIO и обратно. Это механизм передачи данных низкого уровня, существующий параллельно с классами библиотеки ввода-вывода более высокого уровня (пакеты java.io и java.net). Реализация канала может быть получена из класса передачи данных высокого уровня, такого как java.io.File, java.net.ServerSocket, или java.net.Socket, и наоборот. Каналы аналогичны « файловым дескрипторам », встречающимся в Unix-подобных операционных системах.

Файловые каналы ( java.nio.channels.FileChannel) может использовать произвольные буферы, но также может создать буфер, напрямую сопоставленный с содержимым файла с помощью файла, отображенного в памяти . Они также могут взаимодействовать с блокировками файловой системы . Аналогично, сокетов ( каналы java.nio.channels.SocketChannel и java.nio.channels.ServerSocketChannel) позволяют передавать данные между сокетами и буферами NIO.

FileChannel может использоваться для копирования файла, что потенциально гораздо более эффективно, чем использование старого чтения/записи с массивом байтов. Типичный код для этого:

// 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);
}

Селекторы

[ редактировать ]

Селектор ( java.nio.channels.Selector и подклассы) предоставляет механизм ожидания каналов и распознавания, когда один или несколько каналов становятся доступными для передачи данных. Когда в селекторе зарегистрировано несколько каналов, это позволяет блокировать ход программы до тех пор, пока хотя бы один канал не будет готов к использованию или пока не возникнет состояние прерывания.

Хотя такое поведение мультиплексирования можно реализовать с помощью потоков, селектор может обеспечить значительно более эффективную реализацию с использованием конструкций операционной системы более низкого уровня. концепций select ( Например, POSIX-совместимая операционная система будет иметь прямое представление этих ) . Заметным применением этой конструкции могла бы стать общая парадигма серверного программного обеспечения, которая предполагает одновременное ожидание ответов в нескольких сеансах.

Наборы символов

[ редактировать ]

В Java набор символов — это отображение между символами Юникода (или их подмножеством) и байтами. java.nio.charset Пакет NIO предоставляет средства для идентификации наборов символов и предоставления алгоритмов кодирования и декодирования для новых сопоставлений.

Неожиданно, что канал, связанный с файлом Java IO RandomAccess, закрывает дескриптор файла при прерывании, тогда как собственный метод чтения RandomAccessFiles этого не делает. [5]

JDK 7 и НИО.2

[ редактировать ]

JDK 7 включает в себя java.nio.file пакет, который вместе с Path Класс (также новый в JDK 7), помимо других функций, предоставляет расширенные возможности для задач файловой системы, например, может работать с символическими / жесткими ссылками и выгружать большие списки каталогов в буферы быстрее, чем старый класс File. java.nio.file пакет и связанный с ним пакет, java.nio.file.attribute, обеспечивают комплексную поддержку файлового ввода-вывода и доступа к файловой системе. Поставщик файловой системы zip также доступен в JDK 7.

The java.nio.file.LinkOption — это пример эмуляции расширяемых перечислений с помощью интерфейсов. [6] В Java невозможно иметь один Enum продлить еще один Enum. Однако можно эмулировать расширяемый Enum печатать, имея Enum реализовать один или несколько интерфейсов. LinkOption — это тип перечисления, который реализует как OpenOption и CopyOption интерфейсы, которые имитируют эффекты расширяемого Enum тип. Небольшим недостатком этого подхода является то, что реализации не могут наследоваться между различными Enum типы.

[6]

  1. ^ «Java NIO — Руководство разработчика основных библиотек Java» . doc.oracle.com . Проверено 30 сентября 2022 г.
  2. ^ «Начало работы с новым вводом-выводом (NIO)» . разработчик.ibm.com . Проверено 30 сентября 2022 г.
  3. ^ «JSR 51: Новые API ввода-вывода для платформы JavaTM» . Программа Java Community Process (SM) — JSR: запросы спецификаций Java . Проверено 23 мая 2009 г.
  4. ^ «Этот JSR будет поставляться как часть Java SE 7 «Dolphin».» «JSR 203: новые API ввода-вывода для платформы JavaTM («NIO.2»)» . Программа Java Community Process (SM) — JSR: запросы спецификаций Java . 30 января 2006 г. Проверено 23 мая 2009 г.
  5. ^ Не думайте, что вы знаете, что лучше , Шон Пирс, автор книги Gerrit (Программное обеспечение) , 14 мая 2010 г.
  6. ^ Перейти обратно: а б Bloch 2018 , стр. 176–179, Глава §6, пункт 38. Эмуляция расширяемых перечислений с помощью интерфейсов.
  • Блох, Джошуа (2018). «Эффективная Java: Руководство по языку программирования» (третье изд.). Аддисон-Уэсли. ISBN  978-0134685991 .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: f686bb3f5bb0a4ad5d9b0024567f3fd3__1703945040
URL1:https://arc.ask3.ru/arc/aa/f6/d3/f686bb3f5bb0a4ad5d9b0024567f3fd3.html
Заголовок, (Title) документа по адресу, URL1:
Non-blocking I/O (Java) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)