Java: jaka dokładnie jest różnica między NIO a NIO.2?

85

Nie bardzo rozumiem, jak bardzo się od siebie różnią, więc mam kilka pytań dotyczących tych dwóch pakietów.

Po rozejrzeniu się trochę w Google, wygląda na to, że Oracle zdecydowało się zaktualizować NIOpakiet o nowszy i ulepszony NIO.2pakiet w ramach wydania JDK7.

  1. Jak wypada wydajność NIOpakietu w porównaniu z NIO.2pakietem?
  2. Jakie są duże zmiany od NIOdo NIO.2? (np. nowe metody, funkcje)
  3. Dlaczego oryginalny NIOpakiet musiał zostać zaktualizowany?
  4. Czy obecnie NIO.2jest synonimem tego NIOpakietu?

Nie chodzi o to, że chcę używać starszego pakietu w moim kodzie, jestem po prostu bardzo ciekawy tego. Proszę powiedz mi, jakie są różnice?

John Huynh
źródło
2
NIO2 wprowadza asynchroniczne operacje we / wy i pakiet java.nio.files.
user207421
Czy to to? Miałem wrażenie, że NIO.2 to coś wielkiego.
John Huynh
1
Najpierw mieli IO. Następnie wprowadzili „New IO”. Potem chcieli wprowadzić więcej funkcji, więc sprytnie nazwali to „New IO 2”.
Kayaman
1
Dzięki, pomyślałem. Czy to oznacza, że ​​„Nowe IO 2” jest lepsze pod każdym względem od pozostałych dwóch? Czytam książkę „The Java Tutorial” i uczy o NIO.2, ale ma też sekcję o IO.
John Huynh
1
@JohnHuynh Nie, to znaczy, że wprowadza nowe funkcje. Jeśli ich nie potrzebujesz, nie używaj ich.
user207421

Odpowiedzi:

86

Java początkowo oferowała Fileklasę w java.iopakiecie, aby uzyskać dostęp do systemów plików. Ten obiekt reprezentuje plik / katalog i umożliwił wykonanie pewnych operacji, takich jak sprawdzenie, czy plik / katalog istnieje, pobranie właściwości i usunięcie go. Miał jednak pewne wady. By wymienić tylko kilka:

  • Klasa File nie miała niektórych ważnych funkcji, takich jak metoda kopiowania.
  • Zdefiniowano również wiele zwracanych metod boolean. Jak można sobie wyobrazić, w przypadku błędu falsezwracano, zamiast rzucać wyjątek. Deweloper rzeczywiście nie mógł wiedzieć, dlaczego się nie udało.
  • Nie zapewnia dobrej obsługi przy obsłudze dowiązań symbolicznych.
  • Podano ograniczony zestaw atrybutów plików.

Aby przezwyciężyć te problemy, pakiet java.nio został wprowadzony w java 4. Kluczowe cechy to:

  • Kanały i selektory: Kanał jest abstrakcją dotyczącą funkcji systemu plików niższego poziomu, np. Plików mapowanych w pamięci.
  • Bufory: buforowanie dla wszystkich klas pierwotnych (z wyjątkiem Boolean).
  • Zestaw znaków: zestaw znaków (java.nio.charset), kodery i dekodery do mapowania bajtów i symboli Unicode

Wraz z java 7 wprowadzono pakiet java.nio.file zapewniający lepszą obsługę dowiązań symbolicznych, dostęp do atrybutów plików, a zwłaszcza obsługę rozszerzonego systemu plików za pomocą klas takich jak ścieżka, ścieżki i pliki. Możesz rzucić okiem na opis pakietu java.nio.file, aby uzyskać więcej szczegółów na ten temat.

Mając to na uwadze:

Jakie są duże zmiany od NIO do NIO.2? (np. nowe metody, funkcje)?

Służą różnym celom. Aby wskazać duże zmiany, możesz spojrzeć na cały nowy pakiet java.nio.file.

Dlaczego oryginalny pakiet NIO musiał zostać zaktualizowany?

Tak się nie stało. Nowy pakiet został wprowadzony, a nie zaktualizowany.

Czy NIO.2 jest obecnie synonimem pakietu NIO? Jak wypada porównanie pakietu NIO z pakietem NIO.2?

Nie, nie są synonimami. Porównywanie ich wydajności również nie ma większego sensu, ponieważ służą one różnym celom. NIO to bardziej abstrakcyjne wejścia / wyjścia niskiego poziomu i NIO2 skupione na zarządzaniu plikami.

Mam nadzieję że to pomoże.

[Bibliografia: Oracle Certified Professional Java SE7 - obszerny przewodnik certyfikacji OCJP7 autorstwa SGGanesh i Tushar Sharma - rozdział 9]

Sousa Gaspar
źródło
56

W NIO.2 wprowadzono asynchroniczne we / wy .

Asynchroniczne operacje we / wy to podejście do nieblokujących operacji we / wy, które nie jest obsługiwane przez NIO.

NIO: selektory / wzór reaktora

NIO.2: obsługa zakończenia / wzorzec proaktora

Dlatego w systemie Windows NIO.2 używa portów zakończenia we / wy , co powinno zwiększyć wydajność. Tyle tylko, że nikt nie wie, ponieważ nikt nie używa systemu Windows po stronie serwera, a jeśli tak, to prawdopodobnie robią to, ponieważ są mocno zainwestowani w .net iz tego powodu najprawdopodobniej nie będą rozważać używania Javy.

Evgeniy Berezovsky
źródło
3
Nigdy nie mów nigdy. W użyciu jest wiele serwerów opartych na systemie Windows, zwłaszcza gdy przewidywane obciążenie pracą nie jest tak duże.
Jonathan Rosenne
reactor vs proactor to to, co najbardziej zauważyłem
Lefteris Eleftheriades
1
Mnóstwo serwerów Windows w mojej firmie, która jest wiodącą organizacją finansową, i używamy głównie języka Java.
Janac Meena
9

Moje podanie:

Krótka wersja

Jest to dodanie pakietu java.nio.file ze znacznie ulepszoną funkcjonalnością plików i systemów plików na wysokim poziomie.
Z punktu widzenia gniazd sieciowych lub niskiego poziomu dostępu do plików, NIO == NIO.2 z kilkoma udogodnieniami.

Dłuższa wersja

Java IO

Pakiet: java.io
stary blokujący interfejs I / O API

Java NIO

Dodano w Javie 1.4, nowym nieblokującym API.
Pakiet: java.nio
nieblokujące IO Java. Klasy podoba Selector, SelectorKey, Channel.
Wydaje mi Nio to duży krok w górę do sieci I / O ( Selector, SelectorKey, SocketChannel, ServerSocketChannel, Buffer), a tym bardziej dla pliku I / O ( FileChanneli Buffertylko w tym pamięci mapowane plików). Jest to interfejs API dość niskiego poziomu, zarówno dla części sieciowych, jak i plików.

Java NIO.2

Dodano w Javie 7. Chodzi głównie o dodanie znacznie ulepszonego interfejsu API do obsługi plików i systemów plików oraz adresowania. Nowy interfejs API związany z plikami i systemem plików jest stosunkowo wysoki.

Pakiet: java.nio.filei kilka dodatków do rodzica java.nio.
Te dodatki są dla we / wy pliku i tylko kilka pomniejszych dodatków do sieciowego we / wy lub niskiego poziomu API plików.

Najbardziej zauważalną niskim poziomie, nie jest konieczne plik związane, dodatki API są AsynchronousSocketChannel, AsynchronousServerSocketChanneli AsynchronousFileChannel, co dodaje callbacków warianty niektórych metod. Wersje asynchroniczne programu to przede wszystkim udogodnienie; takie interfejsy mapowania mogły zostać zhakowane razem nawet wcześniej, ale teraz są one dostępne po wyjęciu z pudełka w środowisku JRE.

Nowe API plików zapewnia wiele korzyści - znacznie bardziej przydatne adresowanie systemu plików za pomocą Path, znacznie ulepszone manipulowanie plikami ZIP przy użyciu niestandardowego dostawcy systemu plików, dostęp do specjalnych atrybutów plików, wiele wygodnych metod, takich jak odczyt całego pliku za pomocą jednego polecenia, kopiowanie pliku za pomocą jedno polecenie itd. Ale to wszystko jest związane z plikami / systemem plików i wszystko na dość wysokim poziomie.

Powtarzając to, co powiedziałem powyżej, z perspektywy gniazd sieciowych czy niskiego poziomu dostępu do plików, NIO == NIO.2

Odpowiednie linki

Espinosa
źródło