Node.js ist natürlich asynchron und ereignisorientiert und ideal für die Umgang mit E/O-verwandten Aufgaben. Wenn Sie sich mit I/O-Bezogenen Operationen in Ihrer Bewerbung befassen, können Sie Streams in node.js. Schauen wir uns daher die Streams im Detail an und verstehen, wie sie die I/A -Operationen vereinfachen.
Was ist Fluss
Streams sind Unix -Pipelines, mit denen Sie Daten einfach von einer Datenquelle lesen und dann zu einem anderen Ziel fließen können.
Einfach ausgedrückt, Streaming ist nichts Besonderes, es ist nur ein Eventemitter, der einige Methoden implementiert. Nach der implementierenden Methode kann der Stream zu einem lesbaren Stream (lesbar), einem beschreibbaren Stream (beschreibbar) oder einem bidirektionalen Stream (Duplex, lesbar und beschreibbar) werden.
Mit einem lesbaren Stream können Sie Daten aus einer Datenquelle lesen, während ein schriftlicher Stream Sie ermöglicht, Daten an Ihr Ziel zu schreiben.
Wenn Sie Node.js verwendet haben, sind Sie wahrscheinlich auf Streaming gestoßen.
In einem HTTP -Server von node.js ist beispielsweise ein lesbarer Stream und eine Antwort ein beschreibbarer Stream.
Möglicherweise haben Sie auch das FS -Modul verwendet, mit dem Sie lesbare und beschreibbare Streams umgehen können.
Lassen Sie sich nun einige Grundlagen lernen und verschiedene Arten von Strömen verstehen. In diesem Artikel werden lesbare und beschreibbare Streams erörtert. Bidirektionale Ströme liegen außerhalb des Rahmens dieses Artikels und wir werden sie nicht diskutieren.
Lesbare Streams
Wir können einen lesbaren Stream verwenden, um Daten aus einer Datenquelle zu lesen, die alles sein können, z. B. eine Datei im System, einen Puffer im Speicher oder sogar andere Streams. Da Streams Eventemitter sind, senden sie Daten mit verschiedenen Ereignissen. Wir werden diese Ereignisse nutzen, um den Fluss funktioniert.
Daten aus dem Stream lesen
Der beste Weg, um Daten aus einem Stream zu lesen, besteht darin, auf Datenereignisse zu hören und eine Rückruffunktion hinzuzufügen. Wenn die Datenüberschreitungen überschreiten, sendet der lesbare Stream ein Datenereignis und die Rückruffunktion wird ausgelöst. Schauen Sie sich den folgenden Code -Snippet an:
var fs = required ('fs'); var readablErtream = fs.createadstream ('file.txt'); var data = ''; var readablestream.on ('data', function (chunk) {data += chunk;}); readablestream.on ('end', function () {console.log (data);});});});Fs.CreateadStream bietet Ihnen einen lesbaren Stream.
Zu Beginn war dieser Strom nicht fließend dynamisch. Wenn Sie den Ereignishörer von Data hinzufügen und eine Rückruffunktion hinzufügen, wird sie fließen. Danach wird ein kleines Datenstück gelesen und in Ihre Rückruffunktion übergeben.
Der Implementierer des Streams bestimmt die Auslöserhäufigkeit des Datenereignisses. Beispielsweise löst die HTTP -Anforderung das Datenereignis aus, wenn mehrere KBs gelesen werden. Wenn Sie Daten aus einer Datei lesen, können Sie beschließen, das Datenereignis auszulösen, wenn eine Zeile fertig ist.
Wenn keine Daten zu lesen sind (wenn es am Ende der Datei gelesen wird), sendet der Stream ein End -Ereignis. Im obigen Beispiel haben wir dieses Ereignis angehört und die Daten ausgedruckt, als wir die Datei gelesen haben.
Es gibt eine andere Möglichkeit, Streams zu lesen. Sie müssen nur die Read () -Methode in der Stream -Instanz weiter aufrufen, bevor Sie bis zum Ende der Datei lesen.
var fs = required ('fs'); var readablErstream = fs.creeadstream ('file.txt'); var data = ''; var chunk; readableStream.on ('lesable', function () {while (chunk = readableStream.read ()! console.log (Daten);});Die Read () -Methode liest Daten aus dem internen Puffer und gibt NULL zurück, wenn keine Daten zu lesen sind.
Daher überprüfen wir in der while -Schleife, ob Read () NULL zurückgibt, und wenn sie NULL zurückgibt, wird die Schleife beendet.
Es ist zu beachten, dass das lesbare Ereignis, wenn wir Daten aus dem Stream lesen können, abgefeuert werden.
Setzen Sie Codierung
Standardmäßig ist das, was Sie aus dem Stream lesen, ein Pufferobjekt. Wenn Sie eine Zeichenfolge lesen, ist dies nichts für Sie. Daher können Sie die Codierung des Streams festlegen, indem Sie lesbar.setencoding () wie im folgenden Beispiel aufrufen:
var fs = require ('fs'); var readablErstream = fs.creeadstream ('file.txt'); var data = ''; readablestream.setEcoding ('utf8'); readablErstream.on ('data', function (chunk) {Data += chunk;});Wenn wir im obigen Beispiel die Codierung des Streams auf UTF8 festlegen, werden die Daten in UTF8 analysiert, und der Teile in der Rückruffunktion ist eine Zeichenfolge.
Rohrleitungen
Pipelines sind ein großartiger Mechanismus, bei dem Sie Daten aus einer Datenquelle lesen können, ohne den Status des Streams selbst zu verwalten und an Ihr Ziel zu schreiben. Schauen wir uns das folgende Beispiel an:
var fs = required ('fs'); var readablErtream = fs.createadstream ('file1.txt'); var writeAllESTREAM = fs.createwritestream ('file2.txt'); readablestream.pipe (WritableStream);Das obige Beispiel verwendet die Pipe () -Methode, um den Inhalt von Datei1 in Datei2 zu schreiben. Da Pipe () Ihnen hilft, den Datenfluss zu verwalten, müssen Sie sich keine Sorgen um die Geschwindigkeit des Datenflusss machen. Dies macht Pipe () sehr einfach und einfach zu bedienen.
Es ist zu beachten, dass Pipe () den Zielstrom zurückgibt, sodass Sie mehrere Streams problemlos verknüpfen können!
Link (Verkettung)
Angenommen, es gibt eine Archivdatei und Sie möchten sie entpacken. Es gibt viele Möglichkeiten, diese Aufgabe zu erfüllen. Der einfachste Weg ist jedoch, Pipelines und Links zu verwenden:
var fs = require ('fs'); var zlib = require ('zlib'); fs.createadstream ('input.txt.gz') .pipe (zlib.createGunzip ()) .pipe (fs.createwritestream ('output.txt');Zuerst erstellen wir einen lesbaren Stream über input.txt.gz und lassen ihn dann den Stream zlib.createGunzip () streamen, der den Inhalt dekomprimiert. Schließlich fügen wir einen beschreibbaren Stream hinzu, um den dekomprimierten Inhalt einer anderen Datei zu schreiben.
Andere Methoden
Wir haben einige wichtige Konzepte in lesbaren Streams besprochen, und hier sind einige Möglichkeiten, wie Sie wissen müssen:
1. Readable.Pause () Diese Methode pausiert den Fluss des Flusses. Mit anderen Worten, es wird das Datenereignis nicht erneut auslösen.
2. Readable.
3. Readable.Unpipe () Methode entfernen das Ziel. Wenn Parameter übergeben sind, lässt der lesbare Stream das spezifische Ziel von Liu Xiang gestoppt, andernfalls werden alle Ziele entfernt.
Beschreibbare Streams
Mit einem beschreibbaren Stream können Sie Daten an Ihr Ziel schreiben. Genau wie lesbare Streams sind dies Eventemitter, die auch verschiedene Ereignisse auslösen. Schauen wir uns die Ereignisse und Methoden an, die im beschreibbaren Strom ausgelöst werden.
Schreiben Sie in Stream
Um Daten als beschreibbarer Stream zu schreiben, müssen Sie die Write () -Methode in der beschreibbaren Stream -Instanz aufrufen und das folgende Beispiel sehen:
var fs = require ('fs'); var readablErstream = fs.creeadstream ('file1.txt'); var writeAllESTREAM = fs.createwritestream ('file2.txt'); readableStream.setencoding ('utf8'); readablestream.on ('data', function (chunk) {schriftlich);Der obige Code ist sehr einfach. Er liest nur die Daten aus dem Eingabestream und schreibt ihn mit Write () an das Ziel.
Diese Methode gibt einen booleschen Wert zurück, um anzuzeigen, ob das Schreiben erfolgreich ist. Wenn die zurückgegebene wahre Wahrung bedeutet, dass das Schreiben erfolgreich ist und Sie weiterhin mehr Daten schreiben können. Wenn es falsch ist, bedeutet es, dass etwas Fehler aufgetreten ist und Sie jetzt nicht weiter schreiben können. Ein beschreibbarer Stream löst ein Drain -Ereignis aus, um Ihnen mitzuteilen, dass Sie weiterhin Daten schreiben können.
Nach dem Schreiben der Daten
Wenn Sie keine Daten schreiben müssen, können Sie die Ende () aufrufen, um den Stream mitzuteilen, dass Sie das Schreiben fertig haben. Unter der Annahme, dass RES ein HTTP -Antwortobjekt ist, senden Sie normalerweise eine Antwort an den Browser:
res.write ('einige Daten !!');
res.end ();
Wenn End () aufgerufen wird, werden alle Daten geschrieben und der Stream wird dann ein Finish -Ereignis ausgelöst. Beachten Sie, dass Sie nach dem Aufrufen von End () keine Daten mehr in den schriftlichen Stream schreiben können. Beispielsweise meldet der folgende Code einen Fehler:
res.write ('einige Daten !!');
res.end ();
res.write ('Versuch wieder zu schreiben'); //Fehler !
Hier sind einige wichtige Ereignisse im Zusammenhang mit beschreibbaren Streams:
1.Error wird feuert, wenn ein Fehler schriftlich oder Verknüpfung auftritt
2.Pipe Wenn der lesbare Stream mit dem beschreibbaren Stream verknüpft ist, wird dieses Ereignis ausgelöst
3.Unpipe wird ausfeuern, wenn der Auftrieb durch lesbarer Stream aufgerufen wird
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.