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

85

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

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

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

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

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

Ответы:

86

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

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

Для решения этих проблем в java 4 был представлен пакет java.nio. Ключевыми функциями были:

  • Каналы и селекторы: канал - это абстракция функций файловой системы более низкого уровня, например файлов с отображением в память.
  • Буферы: буферизация для всех примитивных классов (кроме Boolean).
  • Набор символов: набор символов (java.nio.charset), кодировщики и декодеры для сопоставления байтов и символов Юникода

В 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, SGGanesh and Tushar Sharma - Chapter 9]

Соуза Гаспар
источник
56

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

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

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

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

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

Евгений Березовский
источник
3
Никогда не говори никогда. Используется много серверов на базе Windows, особенно когда прогнозируемая рабочая нагрузка не так высока.
Джонатан Розенн
реактор против проактора - вот что я заметил больше всего
Лефтерис Элефтериадес
1
В моей компании, ведущей финансовой организации, множество серверов Windows, и мы в основном используем Java.
Janac Meena
9

Мое мнение:

Укороченная версия

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

Более длинная версия

Java IO

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

Java NIO

Добавлен в Java 1.4 новый неблокирующий API.
Пакет: java.nio
Java неблокирующий ввод-вывод. Классы нравится Selector, SelectorKey, Channel.
Это , мне кажется, НИО был большой шаг для сети I / O ( Selector, SelectorKey, SocketChannel, ServerSocketChannel, Buffer), намного меньше для файла I / O ( 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

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

Эспиноза
источник