Java: какая разница между NIO и NIO.2?
Я не совсем понимаю, насколько они отличаются друг от друга, поэтому у меня есть несколько запросов относительно этих двух пакетов.
Оглядываясь немного на Google, похоже, что Oracle решил обновить пакет NIO
новым и расширенным пакетом NIO.2
как часть выпуска JDK7.
- Как производительность пакета
NIO
сравнивается с пакетом NIO.2
?
- Какие большие изменения от
NIO
до NIO.2
? (например, новые методы, функции).
- Почему первоначальный пакет
NIO
должен быть обновлен?
- Является ли
NIO.2
синонимом пакета NIO
в настоящее время?
Не то, чтобы я хотел использовать старый код в своем коде, мне просто очень интересно. Пожалуйста, скажите мне их отличия?
Ответы
Ответ 1
Изначально Java началась с предложения класса File
в пакете java.io
для доступа к файловым системам. Этот объект представляет файл/каталог и позволил вам выполнить некоторые операции, такие как проверка, существует ли файл/каталог, получить свойства и удалить его. Однако у него были некоторые недостатки. Чтобы назвать несколько:
- В классе File отсутствовали некоторые важные функции, такие как метод копирования.
- Он также определил много методов, которые возвратили
boolean
. Как можно себе представить, в случае ошибки был возвращен false
, а не исключение. У разработчика действительно не было возможности узнать, почему это не удалось.
- Не обеспечивает хорошую обработку при поддержке символических ссылок.
- Был предоставлен ограниченный набор атрибутов файла.
Чтобы преодолеть эти проблемы, в java 4 был представлен пакет java.nio. Ключевые особенности:
- Каналы и селекторы. Канал является абстракцией низкоуровневых функций файловой системы, например, отображенные в память файлы.
- Буферы: Буферизация для всех примитивных классов (кроме логических).
- Charset: Charset (java.nio.charset), кодировщики и декодеры для сопоставления байтов и символов Unicode
В java 7 представлен пакет java.nio.file, обеспечивающий лучшую поддержку для обработки символических ссылок, доступа к атрибутам файлов и особенно для поддержки расширенной файловой системы с помощью таких классов, как Path, Paths и Files. Возможно, вы захотите взглянуть на описание пакета java.nio.file, чтобы получить более подробную информацию об этом.
Имея это в виду:
Какие большие изменения от NIO до NIO.2? (например, новые методы, особенности)?
Они служат разным целям. Чтобы указать на большие изменения, вы, возможно, захотите взглянуть на новый пакет java.nio.file
.
Почему нужно обновить оригинальный пакет NIO?
Это не так. Новый пакет был представлен, а не обновлен.
Является ли NIO.2 просто синонимом пакета NIO в настоящее время? Как сравнить производительность пакета NIO с пакетом NIO.2?
Нет, они не являются синонимами. Также не имеет смысла сравнивать производительность между ними, поскольку они служат различным целям. NIO - более абстрактный низкоуровневый ввод/вывод данных и NIO2, ориентированные на управление файлами.
Надеюсь, это поможет.
[Библиография: Oracle Certified Professional Java SE7 - всеобъемлющее руководство по сертификации OCJP7, С.Г.Ганеш и Тушар Шарма - Глава 9]
Ответ 2
NIO.2 представил асинхронный i/o.
Асинхронный ввод-вывод - это подход к неблокирующему вводу/выводу, который не поддерживается NIO.
NIO: селектор/схема реактора
NIO.2: обработчики завершения /шаблон проактора
Таким образом, когда в Windows NIO.2 использует порт завершения ввода-вывода, это должно повысить производительность. Кроме того, никто не знает, потому что никто не использует Windows на стороне сервера, и если они это сделают, они, вероятно, это сделают, потому что они сильно инвестированы в .net, и по этой причине, скорее всего, не рассмотрят использование Java.
Ответ 3
Мой дубль:
Короткая версия
Это добавление пакета java.nio.file с его значительно расширенной функциональностью файлов и файловой системы.
С точки зрения сетевых сокетов или низкоуровневого доступа к файлам, NIO == NIO.2 с некоторыми улучшениями удобства.
Более длинная версия
Java IO
Пакет: java.io
Старый блокирующий API ввода/вывода
Java NIO
В Java 1.4 добавлен новый неблокирующий API.
Пакет: java.nio
Java неблокирующий ввод-вывод. Классы, такие как Selector
, SelectorKey
, Channel
.
Мне кажется, что NIO был большим шагом вперед для сетевого ввода-вывода (Selector
, SelectorKey
, SocketChannel
, ServerSocketChannel
, Buffer
), намного меньше для файлового ввода-вывода (FileChannel
и Buffer
только, включая отображенные в память файлы).
Это довольно низкоуровневый API, как для сетевой, так и для файловой частей.
Java NIO.2
Добавлено в Java 7. Главным образом, это добавление значительно улучшенного API для управления файлами и файловой системой и адресации. Новый API, связанный с файлами и файловой системой, находится на относительно высоком уровне.
Пакет: java.nio.file
и несколько дополнений к родителю java.nio
.
Это дополнение для файлового ввода-вывода и только несколько незначительных дополнений к сетевому вводу-выводу или файловому API низкого уровня.
Наиболее заметными низкоуровневыми, необязательными связанными с файлами дополнениями API являются AsynchronousSocketChannel
, AsynchronousServerSocketChannel
и AsynchronousFileChannel
, которые добавляют варианты обратных вызовов для некоторых методов. Асинхронные версии в основном удобны; такие интерфейсы отображения могли быть взломаны вместе еще раньше, но теперь они доступны в JRE.
Новый файловый API предоставляет множество полезных функций - гораздо более полезная адресация файловой системы с помощью Path, значительно улучшенная обработка ZIP файлов с использованием настраиваемого поставщика файловой системы, доступ к специальным атрибутам файлов, множество удобных методов, таких как чтение всего файла одной командой, копирование файла с помощью одна команда и т.д. Но все это связано с файлом/файловой системой и все довольно высокого уровня.
Повторяя то, что я уже сказал выше, с точки зрения сетевых сокетов или низкоуровневого доступа к файлам, NIO == NIO.2
Соответствующие ссылки