Java: в чому саме різниця між NIO та NIO.2?


83

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

Подивившись трохи на 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.
Маркіз Лорнський

Є те, що його? У мене склалося враження, що NIO.2 - це щось величезне.
Джон Хайн

1
Спочатку у них був ВВ. Потім вони запровадили "Новий IO". Потім вони захотіли представити більше функціональних можливостей, тому назвали його розумно "Новим IO 2".
Каяман

1
Дякую, я зрозумів. То чи означає це, що «Новий IO 2» перевершує в усіх відношеннях інші два? Я читаю книгу "Підручник з Java", і в ній викладається про NIO.2, але там також є розділ про IO.
Джон Хайн

1
@JohnHuynh Ні, це означає, що він вводить нові функції. Якщо вони вам не потрібні, не використовуйте їх.
Маркіз Лорнський,

Відповіді:


85

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]


56

NIO.2 ввів асинхронний ввід / вивід .

Асинхронне введення-виведення - це підхід до неблокуючого вводу-виводу, який не підтримується NIO.

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

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

Таким чином, у Windows NIO.2 використовує порти завершення вводу-виводу , що повинно підвищити продуктивність. Крім того, ніхто не знає, тому що ніхто не використовує Windows на стороні сервера, а якщо і використовує, то, мабуть, робить це, оскільки вони вкладають значні кошти в .net, і з цієї причини, швидше за все, не розглядатимуть питання використання Java.


3
Ніколи не кажи ніколи. Використовується багато серверів на базі Windows, особливо коли прогнозоване робоче навантаження не таке велике.
Джонатан Розен

reactor vs proactor - це те, що я найбільше помітив
Lefteris Eleftheriades

1
Багато серверів Windows у моєї компанії, яка є провідною фінансовою організацією, і ми в основному використовуємо Java.
Janac

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 приносить багато смакот - набагато корисніша адресація файлової системи за допомогою Path, набагато покращена обробка ZIP-файлів за допомогою власного постачальника файлової системи, доступ до спеціальних атрибутів файлів, безліч зручних методів, таких як читання цілого файлу за допомогою однієї команди, копіювання файлу за допомогою одна команда і т. д. Але все це пов'язано з файлами / файловими системами і все досить високого рівня.

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

Відповідні посилання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.