Java: Was genau ist der Unterschied zwischen NIO und NIO.2?


83

Ich verstehe nicht ganz, wie unterschiedlich sie voneinander sind, daher habe ich einige Anfragen zu diesen beiden Paketen.

Nachdem Oracle sich ein wenig bei Google umgesehen hat , scheint es, als hätte Oracle beschlossen, das Paket als Teil der JDK7-Version NIOmit dem neueren und erweiterten NIO.2Paket zu aktualisieren .

  1. Wie ist die Leistung des NIOPakets im Vergleich zum NIO.2Paket?
  2. Was sind einige große Änderungen von NIObis NIO.2? (zB neue Methoden, Funktionen)
  3. Warum musste das Originalpaket NIOaktualisiert werden?
  4. Ist heutzutage NIO.2nur ein Synonym für das NIOPaket?

Es ist nicht so, dass ich das Legacy-Paket in meinem Code verwenden möchte, ich bin nur sehr neugierig darauf. Bitte erzähl mir ihre Unterschiede?


2
NIO2 führt asynchrone E / A und das Paket java.nio.files ein.
Marquis von Lorne

Ist es das? Ich hatte den Eindruck, dass NIO.2 etwas Großes war.
John Huynh

1
Zuerst hatten sie IO. Dann stellten sie "New IO" vor. Dann wollten sie mehr Funktionen einführen und nannten es geschickt "New IO 2".
Kayaman

1
Danke, dachte ich mir. Bedeutet das also, dass "New IO 2" den beiden anderen in jeder Hinsicht überlegen ist? Ich lese das Buch "The Java Tutorial" und es lehrt über NIO.2, aber es enthält auch einen Abschnitt über E / A.
John Huynh

1
@ JohnHuynh Nein, es bedeutet, dass neue Funktionen eingeführt werden. Wenn Sie sie nicht brauchen, verwenden Sie sie nicht.
Marquis von Lorne

Antworten:


85

Java begann zunächst damit, die FileKlasse im java.ioPaket für den Zugriff auf Dateisysteme anzubieten . Dieses Objekt stellt eine Datei / ein Verzeichnis dar und hat es Ihnen ermöglicht, einige Vorgänge auszuführen, z. B. zu überprüfen, ob eine Datei / ein Verzeichnis vorhanden ist, Eigenschaften abzurufen und diese zu löschen. Es hatte jedoch einige Mängel. Um ein paar zu nennen:

  • Der File-Klasse fehlten einige wichtige Funktionen, z. B. eine Kopiermethode.
  • Es wurden auch viele Methoden definiert, die zurückgegeben wurden boolean. Wie man sich vorstellen kann, wurde im Fehlerfall falsezurückgegeben, anstatt eine Ausnahme auszulösen. Der Entwickler hatte in der Tat keine Möglichkeit zu wissen, warum es fehlschlug.
  • Keine gute Handhabung bei der Unterstützung symbolischer Links.
  • Ein begrenzter Satz von Dateiattributen wurde bereitgestellt.

Um diese Probleme zu lösen, wurde das Paket java.nio in Java 4 eingeführt. Die wichtigsten Funktionen waren:

  • Kanäle und Selektoren: Ein Kanal ist eine Abstraktion von Dateisystemfunktionen auf niedrigerer Ebene, z. B. Dateien mit Speicherzuordnung.
  • Puffer: Pufferung für alle primitiven Klassen (außer Boolean).
  • Zeichensatz: Zeichensatz (java.nio.charset), Encoder und Decoder zum Zuordnen von Bytes und Unicode-Symbolen

Mit Java 7 wird das Paket java.nio.file eingeführt, das eine bessere Unterstützung für den Umgang mit symbolischen Links, den Zugriff auf Dateiattribute und insbesondere für die Unterstützung der Erweiterung des Dateisystems durch Klassen wie Pfad, Pfade und Dateien bietet. Vielleicht möchten Sie einen Blick auf die Paketbeschreibung java.nio.file werfen , um weitere Details dazu zu erhalten.

Mit dieser Einstellung:

Was sind einige große Änderungen von NIO zu NIO.2? (zB neue Methoden, Features)?

Sie dienen verschiedenen Zwecken. Um auf große Änderungen hinzuweisen, sollten Sie sich das brandneue Paket ansehen java.nio.file.

Warum musste das ursprüngliche NIO-Paket aktualisiert werden?

Es war nicht so. Ein neues Paket wurde eingeführt und nicht aktualisiert.

Ist NIO.2 heutzutage nur ein Synonym für das NIO-Paket? Wie ist die Leistung des NIO-Pakets im Vergleich zum NIO.2-Paket?

Nein, sie sind auch nicht. Es ist auch wenig sinnvoll, die Leistung zwischen ihnen zu vergleichen, da sie unterschiedlichen Zwecken dienen. NIO ist eine abstraktere Low-Level-Daten-E / A und NIO2, die sich auf die Dateiverwaltung konzentriert.

Hoffe das hilft.

[Bibliographie: Oracle Certified Professional Java SE7 - Ein umfassender OCJP7-Zertifizierungsleitfaden von SGGanesh und Tushar Sharma - Kapitel 9]


57

NIO.2 führte asynchrone E / A ein .

Asynchrone E / A ist ein Ansatz für nicht blockierende E / A, der von NIO nicht unterstützt wird.

NIO: Selektoren / Reaktormuster

NIO.2: Vervollständigungshandler / Proaktormuster

Unter Windows verwendet NIO.2 daher E / A-Abschlussports , die die Leistung steigern sollten. Außer, niemand weiß es, weil niemand Windows auf der Serverseite verwendet, und wenn ja, tun sie dies wahrscheinlich, weil sie stark in .net investiert sind und aus diesem Grund höchstwahrscheinlich nicht in Betracht ziehen, Java zu verwenden.


3
Sag niemals nie. Es werden viele Windows-basierte Server verwendet, insbesondere wenn die projizierte Arbeitslast nicht so hoch ist.
Jonathan Rosenne

Reaktor gegen Proaktor ist das, was mir am meisten aufgefallen ist
Lefteris Eleftheriades

Viele Windows-Server in meinem Unternehmen, einem führenden Finanzunternehmen, und wir verwenden hauptsächlich Java.
Janac Meena

9

Meine Einstellung:

Kurzfassung

Es ist das Hinzufügen des Pakets java.nio.file mit seiner stark erweiterten Datei- und Dateisystemfunktionalität auf hohem Niveau.
Aus der Sicht von Netzwerk-Sockets oder einfachem Dateizugriff ist NIO == NIO.2 mit einigen praktischen Verbesserungen.

Längere Version

Java IO

Paket: java.io
Alte blockierende E / A-API

Java NIO

In Java 1.4 wurde die neue nicht blockierende API hinzugefügt.
Paket: java.nio
Java nicht blockierende E / A. Klassen wie Selector, SelectorKey, Channel.
Es scheint mir , die NIO einen großen Schritt für das Netzwerk war I / O ( Selector, SelectorKey, SocketChannel, ServerSocketChannel, Buffer), viel weniger für Datei - I / O ( FileChannelund Buffernur, einschließlich Memory - Dateien abgebildet). Dies ist eine API auf relativ niedriger Ebene, sowohl für Netzwerk- als auch für Dateiteile.

Java NIO.2

In Java 7 hinzugefügt. Es geht hauptsächlich um das Hinzufügen einer stark verbesserten Datei- und Dateisystem-Manipulations- und Adressierungs-API. Die neue Datei- und Dateisystem-bezogene API ist relativ hoch.

Paket: java.nio.fileund einige Ergänzungen zum Elternteil java.nio.
Diese Ergänzungen gelten für Datei-E / A und nur wenige geringfügige Ergänzungen für Netzwerk-E / A oder Datei-API auf niedriger Ebene.

Am bemerkenswertesten Low-Level, nicht notwendig Datei verwendet, API Ergänzungen sind AsynchronousSocketChannel, AsynchronousServerSocketChannelund AsynchronousFileChannel, die Rückrufe fügen Varianten auf einige Methoden. Die asynchronen Versionen von sind hauptsächlich eine praktische Ergänzung. Solche Mapping-Schnittstellen hätten schon früher zusammen gehackt werden können, aber jetzt sind sie in der JRE sofort verfügbar.

Die neue Datei-API bringt viele Extras mit sich - viel nützlichere Adressierung des Dateisystems mit Path, viel verbesserte Manipulation von ZIP-Dateien mithilfe eines benutzerdefinierten Dateisystemanbieters, Zugriff auf spezielle Dateiattribute, viele praktische Methoden wie das Lesen der gesamten Datei mit einem Befehl und das Kopieren von Dateien mit Ein Befehl usw. Aber es hängt alles mit Datei / Dateisystem zusammen und alles auf ziemlich hohem Niveau.

Ich wiederhole, was ich oben bereits gesagt habe, aus der Perspektive von Netzwerksockets oder Dateizugriff auf niedriger Ebene, NIO == NIO.2

Relevante Links

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.