Heim >Web-Frontend >js-Tutorial >Detaillierte Einführung in Puffer- und Streaming-Module in Node.js_node.js

Detaillierte Einführung in Puffer- und Streaming-Module in Node.js_node.js

WBOY
WBOYOriginal
2016-05-16 16:14:34926Durchsuche

Puffermodul

js wurde ursprünglich für Browser entwickelt und kann daher gut mit Unicode-codierten Zeichenfolgen umgehen, Binärdaten jedoch nicht. Dies ist ein Problem bei Node.js, da Node.js darauf ausgelegt ist, Daten über das Netzwerk zu senden und zu empfangen, häufig im Binärformat. Zum Beispiel:

– Daten über TCP-Verbindung senden und empfangen; - Binärdaten aus Bildern oder komprimierten Dateien lesen
- Daten aus dem Dateisystem lesen und schreiben; - Binäre Datenströme aus dem Netzwerk verarbeiten

Das Buffer-Modul bringt eine Methode zum Speichern von Rohdaten in Node.js mit, sodass Binärdaten im Kontext von js verwendet werden können. Immer wenn Sie Daten verarbeiten müssen, die in E/A-Vorgängen in Node.js verschoben werden, können Sie das Buffer-Modul verwenden.

Klasse: Puffer

Die Buffer-Klasse ist ein globaler Variablentyp, der zur direkten Verarbeitung von Binärdaten verwendet wird. Es kann auf verschiedene Arten aufgebaut werden.

Die Originaldaten werden in einer Instanz der Buffer-Klasse gespeichert. Eine Buffer-Instanz ähnelt einem Integer-Array

1.neuer Puffer (Größe): Ordnen Sie einen neuen Puffer zu, dessen Größe 8-Bit-Bytes beträgt

2. Neuer Puffer (Array): Ordnen Sie einen neuen Puffer mithilfe eines 8-Bit-Byte-Arrays zu 3.new Buffer(str, [encoding]):encoding String-Typ – welche Codierungsmethode verwendet werden soll, die Parameter sind optional.


4. Klassenmethode: Buffer.isEncoding(encoding): Wenn die angegebene Codierung gültig ist, geben Sie true zurück, andernfalls geben Sie false zurück.
5. Klassenmethode: Buffer.isBuffer(obj): Testen Sie, ob dieses obj ein Buffer ist. Return Boolean

6. Klassenmethode: Buffer.concat(list, [totalLength]): Array-Typ {Array} auflisten, Pufferarray, das zur Verbindung verwendet wird. totalLength {Number}-Typ Die Gesamtgröße aller Puffer im obigen Pufferarray.

Zusätzlich zum Lesen der Datei, um eine Instanz des Puffers zu erhalten, kann sie auch direkt erstellt werden, zum Beispiel:



Code kopieren Der Code lautet wie folgt: var bin = new Buffer([ 0x48, 0x65, 0x6c, 0x6c, 0x6c ]);


Puffer ähnelt einer Zeichenfolge. Zusätzlich zur Verwendung des .length-Attributs zum Abrufen der Bytelänge können Sie auch die Methode [index] verwenden, um die Bytes an der angegebenen Position zu lesen, zum Beispiel:


Code kopieren Der Code lautet wie folgt: bin[0]; // => 0x48;

Puffer und Strings können ineinander umgewandelt werden. Beispielsweise können Binärdaten mit der angegebenen Kodierung in Strings umgewandelt werden:


Code kopieren Der Code lautet wie folgt: var str = bin.toString('utf-8'); // =>
Die .slice-Methode gibt keinen neuen Puffer zurück, sondern eher einen Zeiger auf eine Position in der Mitte des ursprünglichen Puffers zurück, wie unten gezeigt.



Code kopieren
Der Code lautet wie folgt: 1.[ 0x48, 0x65, 0x6c, 0x6c, 0x6c ] 2. ^ ^ ^
3. |. |
4. bin bin.slice(2)




Schreibpuffer


Code kopieren

Der Code lautet wie folgt: var buffer = new Buffer(8);//Erstelle einen Puffer mit 8 Byte Speicher console.log(buffer.write('a','utf8'));//Ausgabe 1

Dadurch wird das Zeichen „a“ in den Puffer geschrieben und der Knoten gibt die Anzahl der nach der Codierung in den Puffer geschriebenen Bytes zurück. Die UTF-8-Kodierung des Buchstabens a belegt hier 1 Byte.

Puffer kopieren

Node.js bietet eine Methode zum Kopieren des gesamten Inhalts eines Buffer-Objekts in ein anderes Buffer-Objekt. Wir können nur zwischen vorhandenen Pufferobjekten kopieren, daher müssen sie erstellt werden.


Code kopieren

Der Code lautet wie folgt: buffer.copy(bufferToCopyTo)

Unter diesen ist bufferToCopyTo das zu kopierende Zielpufferobjekt. Beispiel unten:


Code kopieren

Der Code lautet wie folgt:

var buffer1 = neuer Puffer(8);
buffer1.write('nice to meet you','utf8');
var buffer2 = neuer Puffer(8);
buffer1.copy(buffer2);
console.log(buffer2.toString());//Schön dich kennenzulernen

Stream-Modul

In UNIX-Betriebssystemen sind Streams ein Standardkonzept. Es gibt drei Hauptströme:

1.Standardeingabe
2.Standardausgabe
3.Standardfehler

Lesbarer Stream

Wenn Node.js mit Puffern Rohdaten verarbeitet, dann sind Streams normalerweise die Art und Weise, wie Node.js Daten verschiebt. Streams in Node.js sind entweder lesbar oder beschreibbar. Viele Module in Node.js verwenden Streams, einschließlich HTTP und das Dateisystem.

Angenommen, wir erstellen eine Datei „classmates.txt“ und lesen daraus eine Liste mit Namen, um diese Daten zu verwenden. Da es sich bei den Daten um einen Stream handelt, bedeutet dies, dass Sie ab den ersten paar Bytes auf die Daten reagieren können, bevor Sie mit dem Lesen der Datei fertig sind. Dies ist ein häufiges Muster in Node.js:

Code kopieren Der Code lautet wie folgt:

var fs = require('fs');
var stream = fs.ReadStream('classmates.txt');
stream.setEncoding('utf8');
stream.on('data', function (chunk) {
console.log('einige Daten lesen')
});
stream.on('close', function () {
console.log('alle Daten werden gelesen')
});

Im obigen Beispiel werden die Ereignisdaten ausgelöst, wenn neue Daten empfangen werden. Das Schließereignis wird ausgelöst, wenn das Lesen der Datei abgeschlossen ist.

Beschreibbarer Stream

Natürlich können wir auch beschreibbare Streams erstellen, in die Daten geschrieben werden. Das bedeutet, dass Sie mit einem einfachen Skript einen Stream verwenden können, um in eine Datei einzulesen und dann in eine andere Datei zu schreiben:

Code kopieren Der Code lautet wie folgt:

var fs = require('fs');
var readableStream = fs.ReadStream('classmates.txt');
var writableStream = fs.writeStream('names.txt');
readableStream.setEncoding('utf8');
readableStream.on('data', function (chunk) {
writableStream.write(chunk);
});
readableStream.on('close', function () {
writableStream.end();
});

Wenn ein Datenereignis empfangen wird, werden die Daten nun in den beschreibbaren Stream geschrieben.

readable.setEncoding(encoding): return: this

readable.resume(): Wie oben. Mit dieser Methode kann der lesbare Stream weiterhin Datenereignisse auslösen.

readable.pause(): Wie oben. Diese Methode bewirkt, dass ein Stream im Fließmodus das Auslösen von Datenereignissen stoppt, in den Nicht-Flussmodus wechselt und nachfolgende verfügbare Daten im internen Puffer belässt.
Klasse: stream.Writable

Die beschreibbare Stream-Schnittstelle ist eine Abstraktion der Daten, die Sie auf ein Ziel schreiben.

1.writable.write(chunk, [encoding], [callback]):

chunk {String |. Buffer} Zu schreibende Daten
Kodierung {String} Kodierung, wenn Chunk ein String ist
Rückruf {Funktion} Rückruf, nachdem der Datenblock geschrieben wurde
Gibt zurück: {Boolean} true, wenn die Daten vollständig verarbeitet wurden.

Diese Methode schreibt Daten in das zugrunde liegende System und ruft den angegebenen Rückruf auf, nachdem die Daten verarbeitet wurden.

2.writable.cork(): Erzwingt, dass alle Schreibvorgänge bestehen bleiben.

Die beibehaltenen Daten werden geschrieben, wenn .uncork() oder .end() aufgerufen wird.

3.writable.end([chunk], [encoding], [callback])

chunk {String |. Buffer} optional, zu schreibende Daten
Kodierung {String} Kodierung, wenn Chunk ein String ist
Rückruf {Funktion} optional, Rückruf nach Ende des Streams
Der Aufruf von write() nach dem Aufruf von end() erzeugt einen Fehler.

Code kopieren Der Code lautet wie folgt:

// Schreiben Sie „Hallo“ und enden Sie mit „Welt!“. http.createServer(function (req, res) {
res.write('hello, ');
res.end('world!');
// Es ist jetzt kein weiteres Schreiben mehr erlaubt
});

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