Подтвердить что ты не робот

Java: какая разница между NIO и NIO.2?

Я не совсем понимаю, насколько они отличаются друг от друга, поэтому у меня есть несколько запросов относительно этих двух пакетов.

Оглядываясь немного на Google, похоже, что Oracle решил обновить пакет NIO новым и расширенным пакетом NIO.2 как часть выпуска JDK7.

  • Как производительность пакета NIO сравнивается с пакетом NIO.2?
  • Какие большие изменения от NIO до NIO.2? (например, новые методы, функции).
  • Почему первоначальный пакет NIO должен быть обновлен?
  • Является ли NIO.2 синонимом пакета NIO в настоящее время?

Не то, чтобы я хотел использовать старый код в своем коде, мне просто очень интересно. Пожалуйста, скажите мне их отличия?

4b9b3361

Ответ 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

Соответствующие ссылки