Heim  >  Artikel  >  Java  >  Java NIO-Tutorial

Java NIO-Tutorial

伊谢尔伦
伊谢尔伦Original
2016-11-26 09:51:481040Durchsuche

NIO ist die Abkürzung für New I/O. Um die wahre Bedeutung zu verstehen, muss man sich viel Wissen aneignen. Ich habe mir große Mühe gegeben, das gesamte io in diesen Notizen zu skizzieren. Wir ebnen den Weg für umfassendes Lernen für alle.

Eine kurze Geschichte von I/O

Um alle I/O zu verstehen, müssen Sie die I/O-Geschichte von Java verstehen. Die E/A-Geschichte von Java spiegelt unter einem Aspekt auch die Entwicklungsgeschichte von Java wider.

JDK1.0-1.3

In dieser Zeit von Java kann grundsätzlich gesagt werden, dass es keine vollständige I/O-Unterstützung gibt. Da Java-E/A-Vorgänge in diesem Zeitraum blockieren, ist die E/A-Effizienz relativ gering. Wenn Sie eine bessere E/A-Lösung wünschen, müssen Sie sich grundsätzlich auf sich selbst verlassen. In diesem Zeitraum wurde Java auf der Serverseite nicht wiederverwendet, was in hohem Maße auf die schlechte E/A-Effizienz zurückzuführen ist. Nicht nur die E/A wurde nicht gut gemacht, sondern auch eine Reihe peripherer Maßnahmen wurden nicht gut gemacht. Die unterstützten Zeichensatzkodierungen sind begrenzt und häufig sind manuelle Kodierungsarbeiten erforderlich. Und ohne reguläre Ausdrücke ist es sehr schwierig, Daten zu verarbeiten.

JDK1.4-1.6

In Java1.4, das 2002 veröffentlicht wurde, wurde der Java-Sprache nicht blockierende E/A als JSR-51 hinzugefügt. Gleichzeitig wurden die Kodierungs- und Dekodierungsfunktionen des Zeichensatzes erheblich verbessert. Und es gibt eine Klassenbibliothek für reguläre Ausdrücke, die auf Perl basiert. Gleichzeitig wurden auch einige der zugrunde liegenden Implementierungen der alten E/A mit neuen E/A-Methoden neu geschrieben, was die Leistung der alten E/A verbessert hat. Schließlich wurde Java auf der Serverseite populär.

Gleichzeitig begannen auch Dritte, ihre Anstrengungen zu unternehmen. Google hat die Guava-Klassenbibliothek veröffentlicht, deren E/A-Teil einige Dateivorgänge und die Datenübertragung erheblich vereinfacht. Gleichzeitig wurden auch die unter der Leitung von Trustin Lee geschriebenen Nio-Frameworks Netty und Mina weit verbreitet, was die Entwicklung von Java Nio erheblich vorangetrieben hat.

JDK1.7 wird vorgestellt

Mit der Einführung von JSR-203 sahen wir NIO2 in Java1.7. Es bietet uns leistungsfähigere asynchrone E/A-Betriebsfunktionen, die nicht blockieren, und bietet außerdem eine Reihe äußerst praktischer APIs für den Betrieb von Dateisystemen und Dateiattributen. Und leistungsfähigere Netzwerk-E/A

E/A-Unterschied

Was sind die Unterschiede zwischen blockierender E/A, nicht blockierender E/A und asynchroner E/A? Warum führt jede Weiterentwicklung zu einer großen Verbesserung der Java-I/O-Fähigkeiten? Nehmen wir ein Beispiel für ein Gemüseanbauspiel.

Angenommen, es gibt ein Spiel zum Gemüseanbau (ähnlich dem vorherigen QQ Farm). Nachdem der Spieler Gemüse angebaut hat, muss er auf dieser Webseite bleiben und zusehen, wie das Gemüse reift, bevor er es ernten kann. Dies ist eine enorme Zeitverschwendung und die Benutzererfahrung wird definitiv nicht gut sein. Dieses Spiel wurde später überarbeitet. Spieler müssen nach dem Pflanzen von Gemüse nicht mehr auf dieser Webseite bleiben. Wenn sie bei einer bestimmten Überprüfung feststellen, dass das Gemüse reif ist, können sie es ernten . Natürlich wurde das Benutzererlebnis erheblich verbessert und auch die Zeitverschwendung der Benutzer wurde reduziert. Um das Benutzererlebnis jedoch weiter zu verbessern, wurde das Spiel überarbeitet. Nachdem der Spieler Gemüse gepflanzt hat, muss er nicht mehr prüfen, ob das Gemüse reif ist. Wenn das Gemüse reif ist, sendet das Spiel automatisch eine Benachrichtigung an den Benutzer und teilt ihm mit, dass das Gemüse reif ist und er es schnell abholen sollte . Auf diese Weise müssen Benutzer grundsätzlich keine Zeit mehr verschwenden.

Die drei Spielversionen im Beispiel repräsentieren lediglich drei Arten von I/O. Blockierende E/A: Die CPU kann nicht mit dem nächsten Vorgang fortfahren, bis die Daten gelesen und geschrieben wurden, sodass die CPU keine andere Wahl hat, als dort zu warten. Nicht blockierende E/A: Die CPU kann den Vorgang verlassen, bevor die Daten gelesen oder geschrieben werden, und muss nur ab und zu abgefragt werden. Asynchrone E/A: Bevor die Daten gelesen und geschrieben werden, kann die CPU sie verlassen, ohne sich von Zeit zu Zeit um E/A kümmern zu müssen. Wenn die Daten gelesen und geschrieben werden, wird die CPU aktiv benachrichtigt. Die Effizienz zwischen den drei I/O-Typen kann danach beurteilt werden, ob sie hoch oder niedrig ist.

Neue E/A

Nehmen wir die von Java1.4 vorgeschlagene nicht blockierende E/A als Ausgangspunkt und beginnen, das Gesamtbild zu verstehen.

Kanäle

Puffer

Selektoren

Diese drei Klassen bilden die Kern-API für nicht blockierende E/A.

Puffer wird als Pufferbereich übersetzt, bei dem es sich um einen Speicherbereich handelt, der Daten speichern kann. Der Kanal ist ein bisschen wie ein Stream, kann aber vom lokalen E/A zum Netzwerk-E/A gelesen und geschrieben werden. Die meisten NIO-Daten können vom Kanal in den Puffer gelesen oder aus dem Puffer geschrieben werden . zum Kanal.

Java NIO-Tutorial

Bei nicht blockierender E/A kann die CPU gehen, bevor die Daten gelesen oder geschrieben werden, und sie muss nur ab und zu abgefragt werden. Die Frage, ob die Daten gelesen und geschrieben wurden, erfordert nur minimale CPU-Leistung. Wenn die CPU jedoch häufig die Aufgabe wechselt, ist die zum Beibehalten und Wiederherstellen der Szene erforderliche Zeit groß. Sie können also einfach einen Thread verwenden, um zu fragen, ob die Daten bereit sind. Wenn ein Thread fragt, ob die Daten in mehreren Kanälen bereit sind, muss er mehrere Kanäle verwalten. Dies ist

Java NIO-Tutorial

Um Selector zu verwenden, müssen Sie den Kanal bei Selector registrieren und dann Rufen Sie die Methode select() auf. Diese Methode blockiert, bis für einen registrierten Kanal ein Ereignis bereit ist. Sobald diese Methode zurückkehrt, kann der Thread diese Ereignisse verarbeiten.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn