2012-04-29 16 views
16

Ich lernte Java Nio-Paket und ich erkannte, es gibt viele Methoden bereits von File zur Verfügung gestellt, die nio.Files wieder zur Verfügung stellt mit Path-Klasse. So ein paar mehr habe ich. Ich bekomme eigentlich nicht, was ist die tatsächliche Verwendung von NiO-Paket.Was ist die genaue Verwendung von Java Nio-Paket, wenn bereits Methoden mit Io-Paket verfügbar sind

Ich bin nur sehr neu in diesem Paket, so kann meine Frage falsch sein, aber ein wenig Hilfe kann mich weiter zu lesen.

+2

Kein * answasser *, also poste ich einen Kommentar: [Die Wikipedia - Seite darauf] (http://en.wikipedia.org/wiki/New_I/O) diskutiert einige der Ziele und Gründe für die Nio-Paket. –

+0

"Ped" ist pedantisch und Teil der NIO2-Bibliothek, die in Java 7 hinzugefügt wurde. BTW: Obwohl es viele nicht-blockierende NIO-Sockets gibt, verwende ich normalerweise blockierende NIO-Sockets, die IMHO einfacher zu verwenden sind. NIO2 Fügen Sie asynchrones NIO für Sockets und Dateien hinzu. –

Antwort

8

Der Hauptunterschied zwischen IO und NIO ist, dass IO blockiert, während NIO nicht blockiert.

This article erklärt die Unterschiede in den Paketen und was blockiert und nicht blockierende IO ist.

+22

Bitte posten Sie nicht nur einen Link. Wenn diese Verbindung abbricht, tut es auch diese Antwort. –

+2

NIO kann blockierend, nicht blockierend oder asynchron sein. Dies ist überhaupt nicht der Hauptunterschied. – EJP

+0

@Deco Blocking-Faktor gilt auch für 'java.io.File' vs' java.nio.file'? – overexchange

1

Fast jede Methode in java.io.File hat Probleme, die aus Kompatibilitätsgründen nicht behoben werden können. Das offensichtlichste ist, dass die Methoden einen Booleschen Wert zurückgeben, wenn sie fehlschlagen. Diese Probleme plus der Wunsch, Pluggable-Dateisysteme und viele andere Dinge zu unterstützen, machten die Entwicklung einer völlig neuen Dateisystem-API erforderlich, weshalb java.nio.file erstellt wurde.

7

Java-Programmierung, I/O wurde bis vor kurzem mit einer Stream-Metapher durchgeführt. Alle Ein-/Ausgaben werden als die Bewegung einzelner Bytes nacheinander durch ein Objekt, das als Stream bezeichnet wird, betrachtet. Stream I/O wird zur Kontaktierung der Außenwelt verwendet. Es wird auch intern verwendet, um Objekte in Bytes und dann zurück in Objekte umzuwandeln.

NIO hat die gleiche Rolle und den gleichen Zweck wie die ursprüngliche E/A, aber es verwendet eine andere Metapher - Block I/O. java.nio (neue/nicht blockierende I/O)) API wurde mit JDK1.4 eingeführt.

Was ist der Unterschied zwischen Stream I/O und Block I/O?

Ein stream-orientiertes E/A-System behandelt Daten jeweils byteweise. Ein Eingabestrom erzeugt ein Datenbyte, und ein Ausgabestrom verbraucht ein Datenbyte. Es ist sehr einfach, Filter für gestreamte Daten zu erstellen. Es ist auch relativ einfach, mehrere Filter miteinander zu verketten, so dass jeder seinen Teil in einem einzigen, hochentwickelten Verarbeitungsmechanismus spielt. Auf der anderen Seite sind stream-orientierte I/O oft ziemlich langsam.

Ein blockorientiertes E/A-System behandelt Daten in Blöcken. Jede Operation erzeugt oder verbraucht einen Datenblock in einem Schritt. Die Verarbeitung von Daten durch den Block kann viel schneller sein als die Verarbeitung durch das (gestreamte) Byte. Block-orientierten I/O fehlt jedoch etwas von der Eleganz und Einfachheit von Stream-orientierten I/O.

Wann sollten Sie java.io verwenden und wann sollten Sie java.nio bevorzugen?

  1. Skalierbarkeit wird wahrscheinlich Ihre Wahl des Pakets fahren. java.net benötigt einen Thread pro Socket. Die Codierung wird wesentlich einfacher. java.nio ist viel effizienter, aber schwer zu programmieren.

  2. Sie können eine bessere Skalierbarkeit erzielen, wenn Sie mit Zehntausenden von Verbindungen arbeiten, aber bei niedrigeren Zahlen erhalten Sie wahrscheinlich einen besseren Durchsatz, wenn Sie IO blockieren.

  3. Bei der Arbeit mit SSL Java.nio ist nicht etwas, was einfach mit

Wichtig umgehen: Wenn Sie mit einem der Pakete arbeiten, ist es keine gute Idee, den Rahmen von Grund auf bis zu erstellen und es sei denn, Sie haben einen zwingenden Grund zu tun damit.

Für java.nio stellen Projekte wie Grizzly und Quick Server wiederverwendbare, nicht blockierende Serverkomponenten bereit.

Worth lesen Pain points with java.nio

Schließlich läuft es auf spezifischen Anforderungen Ihrer Projekte nach unten und was Sie versuchen zu erreichen. Einige der besten Lösungen erfordern möglicherweise nicht die komplexeste Infrastruktur unter

Update: Kürzlich über NIO.2 Paket, das seit jdk 1.7 existiert. NIO.2 unterscheidet sich von NIO, wobei NIO.2 asynchrone Kanalfunktionen bietet. NIO.2 primer

Wenn Sie mit NIO arbeiten, lohnt es sich, durch den Unterschied zu gehen und welches Ihrem Zweck entspricht.

+0

Ich denke, das ist die bessere Antwort – lolski

+0

Und diese Antwort scheint Kopie-Paste eines Buches zu sein ... – CuriousMind

2

Java NIO: Kanäle und Puffer
In der Standard-IO-API Sie mit Bytestreams und Zeichenströmen arbeiten. In NIO arbeiten Sie mit Kanälen und Puffern. Daten werden immer von einem Kanal in einen Puffer gelesen oder von einem Puffer in einen Kanal geschrieben.

Java NIO: Nicht blockierende IO
Java NIO ermöglicht es Ihnen, nicht blockierende IO zu tun. Zum Beispiel kann ein Thread einen Kanal bitten, Daten in einen Puffer zu lesen. Während der Kanal Daten in den Puffer liest, kann der Thread etwas anderes tun. Sobald Daten in den Puffer eingelesen sind, kann der Thread sie weiter verarbeiten. Das Gleiche gilt für das Schreiben von Daten in Kanäle.

Java NIO: Selektoren
Java NIO enthält das Konzept der "Wähler". Ein Selektor ist ein Objekt, das mehrere Kanäle für Ereignisse überwachen kann (wie: Verbindung geöffnet, Daten angekommen usw.). So kann ein einzelner Thread mehrere Kanäle für Daten überwachen.
More detail on orcale

0

NIO führte auch Kanäle ein, die die Spezialisierung in Stream - Datei, Socket, Netzwerk - abstrahieren.