2012-04-29 18 views
16

Nauczyłem się pakietu java nio i zdałem sobie sprawę, że istnieje wiele metod już dostarczonych przez File, które nio.Files dostarcza ponownie za pomocą klasy Path. Tak jak kilka innych mam. W rzeczywistości nie dostaję tego, co jest faktycznym użyciem pakietu nio.Jakie jest dokładne użycie pakietu java nio, gdy już dostępne są metody z pakietem io

Jestem po prostu bardzo nowy w tym pakiecie, więc może być moje pytanie jest złe, ale niewielka pomoc może zachęcić mnie do dalszego czytania.

+2

Nie jestem * odpowiadaczem *, więc dodam komentarz: [Strona Wikipedii na nim] (http://en.wikipedia.org/wiki/New_I/O) omawia niektóre z celów i przyczyn pakiet nio. –

+0

Będąc pedantyczną, "Ścieżka" jest częścią biblioteki NIO2 dodanej w Javie 7. BTW: Podczas gdy wiele nie skupiam się na niezablokowanych gniazdach NIO, zwykle używam blokujących NIO gniazd, które są prostsze w użyciu IMHO. NIO2 Dodaj asynchroniczny NIO dla gniazd i plików. –

Odpowiedz

8

Główna różnica między IO i NIO polega na tym, że IO blokuje się, a NIO nie blokuje.

This article objaśnia różnice w pakietach oraz to, jakie jest blokujące i nie blokujące IO.

+22

Nie publikuj linku. Kiedy ten link zginie, tak samo jest z tą odpowiedzią. –

+2

NIO może być blokowany, nieblokujący lub asynchroniczny. To nie jest główna różnica. – EJP

+0

@Deco Blokowanie jest również dobre dla 'java.io.File' vs' java.nio.file'? – overexchange

1

Niemal każda metoda w pliku java.io.File ma problemy, których nie można naprawić ze względu na kompatybilność. Najbardziej oczywiste jest to, że metody zwracają wartość logiczną, gdy ulegają awarii. Te problemy oraz chęć obsługi wtykowych systemów plików i wiele innych rzeczy wymagały opracowania zupełnie nowego API systemu plików, dlatego właśnie utworzono plik java.nio.file.

7

Programowanie w języku Java, operacje we/wy do niedawna były wykonywane przy użyciu metafory strumieniowej. Wszystkie operacje wejścia/wyjścia są postrzegane jako ruch pojedynczych bajtów, po jednym na raz, przez obiekt o nazwie Strumień. Stream I/O służy do kontaktowania się ze światem zewnętrznym. Jest również używany wewnętrznie, do przekształcania obiektów w bajty, a następnie z powrotem w obiekty.

NIO ma tę samą rolę i cel, co oryginalne wejście/wyjście, ale używa innej metafory - bloku I/O. java.nio (nowe/nie blokujące operacje we/wy)) Interfejs API został wprowadzony w JDK1.4.

Czym różnią się wejścia/wyjścia strumienia od bloku I/O?

Strumieniowo-zorientowany system I/O przetwarza dane jeden bajt na raz. Strumień wejściowy generuje jeden bajt danych, a strumień wyjściowy pochłania jeden bajt danych. Bardzo łatwo jest tworzyć filtry dla przesyłanych strumieniowo danych. Jest także względnie proste połączenie kilku filtrów razem, tak aby każdy z nich wykonał swoją część, co stanowi pojedynczy, wyrafinowany mechanizm przetwarzania. Z drugiej strony, zorientowane strumieniowo wejścia/wyjścia często są dość powolne.

Blokowy system We/Wy zajmuje się danymi w blokach. Każda operacja produkuje lub zużywa blok danych w jednym kroku. Przetwarzanie danych przez blok może być znacznie szybsze niż przetwarzanie go przez (streamowany) bajt. Ale we/wy zorientowanym blokowo brakuje elegancji i prostoty zorientowanych strumieniowo operacji we/wy.

Kiedy powinieneś używać java.io i kiedy powinieneś preferować java.nio?

  1. Skalowalność prawdopodobnie wpłynie na wybór pakietu. java.net będzie wymagać jednego wątku na gniazdo. Kodowanie będzie znacznie łatwiejsze. java.nio jest znacznie wydajniejszy, ale trudno go kodować.

  2. Możesz uzyskać lepszą skalowalność, gdy masz do czynienia z dziesiątkami tysięcy połączeń, ale przy niższych numerach prawdopodobnie uzyskasz lepszą przepustowość dzięki blokowaniu IO.

  3. Podczas pracy z SSL java.nio nie jest coś, łatwe do czynienia z

Ważne: Jeśli pracujesz z jednej z paczek, to nie jest dobry pomysł, aby stworzyć ramy od podstaw do czasu, gdy masz powód do zrobienia więc.

Dla java.nio projekty takie jak Grizzly i Quick Server zapewniają wielokrotne, nie blokujące się komponenty serwera.

Warto przeczytać Pain points with java.nio

końcu sprowadza się do specyficznych wymagań swoich projektów i co chce osiągnąć. Niektóre z najlepszych rozwiązań mogą nie wymagać najbardziej skomplikowanej infrastruktury. Aktualizacja: Ostatnio dowiedziałem się o pakiecie NIO.2, który istnieje od 1.7 jdk. NIO.2 różni się od NIO, a najważniejszym jest to, że NIO.2 oferuje asynchroniczną funkcjonalność kanału. NIO.2 primer

Jeśli pracujesz z NIO, warto przejść przez różnicę i który jest odpowiedni do twojego celu.

+0

Myślę, że to jest lepsza odpowiedź – lolski

+0

Ta odpowiedź wydaje się być kopią-wklejem książki ... – CuriousMind

2

Java NIO: Kanały i buforów
W standardowym API IO pracujesz z potoków i strumieni bajtowych znaków. W NIO pracujesz z kanałami i buforami. Dane są zawsze odczytywane z kanału do bufora lub zapisywane z bufora na kanale.

Java NIO: Non-blocking IO
Java NIO pozwala zrobić non-blocking IO. Na przykład wątek może poprosić kanał o odczyt danych w buforze. Podczas gdy kanał odczytuje dane do bufora, wątek może zrobić coś innego. Po wczytaniu danych do bufora wątek może kontynuować przetwarzanie. To samo dotyczy zapisywania danych na kanałach.

Java NIO: Selektory
Java NIO zawiera koncepcję "selekcjonerów". Selektor to obiekt, który może monitorować wiele kanałów dla zdarzeń (takich jak: połączenie otwarte, dane dostarczone itd.). W ten sposób pojedynczy wątek może monitorować wiele kanałów danych.
More detail on orcale

0

NIO wprowadziło również kanały, które oddzielają specjalizację od Stream - File, Socket, Network.