Java: в чем именно разница между NIO и NIO.2?

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

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

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

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


person John Huynh    schedule 27.08.2014    source источник
comment
NIO2 представляет асинхронный ввод-вывод и пакет java.nio.files.   -  person user207421    schedule 28.08.2014
comment
Это оно? У меня сложилось впечатление, что NIO.2 — это что-то огромное.   -  person John Huynh    schedule 28.08.2014
comment
Сначала у них был ИО. Затем они представили New IO. Затем они захотели добавить больше функциональности, поэтому назвали его New IO 2.   -  person Kayaman    schedule 28.08.2014
comment
Спасибо, я понял. Значит ли это, что New IO 2 во всех отношениях превосходит два других? Я читаю книгу «Учебник по Java», и в ней рассказывается о NIO.2, но в ней также есть раздел о вводе-выводе.   -  person John Huynh    schedule 28.08.2014
comment
@JohnHuynh Нет, это означает, что в нем представлены новые функции. Если они вам не нужны, не используйте их.   -  person user207421    schedule 27.05.2015


Ответы (3)


Первоначально Java начиналась с предложения класса File в пакете java.io для доступа к файловым системам. Этот объект представляет файл/каталог и позволяет вам выполнять некоторые операции, такие как проверка существования файла/каталога, получение свойств и его удаление. Однако у него были некоторые недостатки. Назвать несколько:

  • В классе File отсутствовали некоторые важные функции, такие как метод копирования.
  • Он также определил множество методов, которые возвращали boolean. Как можно догадаться, в случае ошибки возвращалось false, а не выбрасывалось исключение. У разработчика действительно не было возможности узнать, почему он потерпел неудачу.
  • Не обеспечил хорошую обработку по поддержке символических ссылок.
  • Был предоставлен ограниченный набор атрибутов файла.

Чтобы преодолеть эти проблемы, в java 4 был представлен пакет java.nio. Ключевые особенности:

  • Каналы и селекторы. Канал — это абстракция низкоуровневых функций файловой системы, например. файлы с отображением памяти.
  • Буферы: Буферизация для всех примитивных классов (кроме Boolean).
  • Набор символов: набор символов (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]

person Sousa Gaspar    schedule 28.08.2014

В NIO.2 представлен асинхронный ввод-вывод.

Асинхронный ввод-вывод — это подход к неблокирующему вводу-выводу, который не поддерживается NIO.

NIO: схема селекторов/реакторов

NIO.2: обработчики завершения / шаблон proactor

Таким образом, в Windows NIO.2 использует порты завершения ввода-вывода, что должно повысить производительность. За исключением того, что никто не знает, потому что никто не использует Windows на стороне сервера, а если и используют, то, вероятно, потому, что сильно инвестируют в .net, и по этой причине, скорее всего, не будут рассматривать использование Java.

person Evgeniy Berezovsky    schedule 27.05.2015
comment
Никогда не говори никогда. Используется много серверов на базе Windows, особенно когда прогнозируемая рабочая нагрузка не так высока. - person Jonathan Rosenne; 17.02.2017
comment
реактор против проактора это то, что я заметил больше всего - person Lefteris Eleftheriades; 17.08.2018
comment
В моей компании, которая является ведущей финансовой организацией, много серверов Windows, и мы в основном используем Java. - person Janac Meena; 21.03.2019

Мое мнение:

Краткая версия

Это добавление пакета java.nio.file с его высокоуровневыми значительно расширенными функциями работы с файлами и файловой системой.
С точки зрения сетевых сокетов или низкоуровневого доступа к файлам, NIO == NIO.2 с некоторыми улучшениями удобства.

Большая версия

Java ввод/вывод

Пакет: java.io
Старый блокирующий API ввода-вывода

Java НИО

В 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 для работы с файлами предлагает множество полезных функций: гораздо более полезную адресацию файловой системы с помощью пути, значительно улучшенную работу с ZIP-файлами с использованием настраиваемого поставщика файловой системы, доступ к специальным атрибутам файла, множество удобных методов, таких как чтение всего файла с помощью одной команды, копирование файла с помощью одна команда и т. д. Но все это связано с файлом/файловой системой и все довольно высокого уровня.

Повторяя то, что я уже сказал выше, с точки зрения сетевых сокетов или низкоуровневого доступа к файлам, NIO == NIO.2

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

person Espinosa    schedule 03.09.2019