Node.js - Streams

Was sind Streams?

Streams sind Objekte, mit denen Sie kontinuierlich Daten aus einer Quelle lesen oder Daten in ein Ziel schreiben können. In Node.js gibt es vier Arten von Streams:

  • Readable - Stream, der für den Lesevorgang verwendet wird.

  • Writable - Stream, der für den Schreibvorgang verwendet wird.

  • Duplex - Stream, der sowohl für Lese- als auch für Schreibvorgänge verwendet werden kann.

  • Transform - Eine Art Duplex-Stream, bei dem die Ausgabe basierend auf der Eingabe berechnet wird.

Jeder Stream-Typ ist ein EventEmitterInstanz und löst mehrere Ereignisse zu unterschiedlichen Zeiten aus. Zum Beispiel sind einige der häufig verwendeten Ereignisse -

  • data - Dieses Ereignis wird ausgelöst, wenn Daten zum Lesen verfügbar sind.

  • end - Dieses Ereignis wird ausgelöst, wenn keine Daten mehr zu lesen sind.

  • error - Dieses Ereignis wird ausgelöst, wenn beim Empfangen oder Schreiben von Daten ein Fehler auftritt.

  • finish - Dieses Ereignis wird ausgelöst, wenn alle Daten auf das zugrunde liegende System übertragen wurden.

Dieses Tutorial bietet ein grundlegendes Verständnis der häufig verwendeten Vorgänge in Streams.

Lesen aus einem Stream

Erstellen Sie eine Textdatei mit dem Namen input.txt mit folgendem Inhalt:

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Erstellen Sie eine js-Datei mit dem Namen main.js mit dem folgenden Code:

var fs = require("fs");
var data = '';

// Create a readable stream
var readerStream = fs.createReadStream('input.txt');

// Set the encoding to be utf8. 
readerStream.setEncoding('UTF8');

// Handle stream events --> data, end, and error
readerStream.on('data', function(chunk) {
   data += chunk;
});

readerStream.on('end',function() {
   console.log(data);
});

readerStream.on('error', function(err) {
   console.log(err.stack);
});

console.log("Program Ended");

Führen Sie nun die Datei main.js aus, um das Ergebnis anzuzeigen.

$ node main.js

Überprüfen Sie die Ausgabe.

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

In einen Stream schreiben

Erstellen Sie eine js-Datei mit dem Namen main.js mit dem folgenden Code:

var fs = require("fs");
var data = 'Simply Easy Learning';

// Create a writable stream
var writerStream = fs.createWriteStream('output.txt');

// Write the data to stream with encoding to be utf8
writerStream.write(data,'UTF8');

// Mark the end of file
writerStream.end();

// Handle stream events --> finish, and error
writerStream.on('finish', function() {
   console.log("Write completed.");
});

writerStream.on('error', function(err) {
   console.log(err.stack);
});

console.log("Program Ended");

Führen Sie nun die Datei main.js aus, um das Ergebnis anzuzeigen.

$ node main.js

Überprüfen Sie die Ausgabe.

Program Ended
Write completed.

Öffnen Sie nun die Datei output.txt, die in Ihrem aktuellen Verzeichnis erstellt wurde. es sollte folgendes enthalten -

Simply Easy Learning

Piping der Streams

Piping ist ein Mechanismus, bei dem wir die Ausgabe eines Streams als Eingabe für einen anderen Stream bereitstellen. Es wird normalerweise verwendet, um Daten von einem Stream abzurufen und die Ausgabe dieses Streams an einen anderen Stream weiterzuleiten. Der Rohrleitungsbetrieb ist unbegrenzt. Jetzt zeigen wir ein Piping-Beispiel zum Lesen aus einer Datei und zum Schreiben in eine andere Datei.

Erstellen Sie eine js-Datei mit dem Namen main.js mit dem folgenden Code:

var fs = require("fs");

// Create a readable stream
var readerStream = fs.createReadStream('input.txt');

// Create a writable stream
var writerStream = fs.createWriteStream('output.txt');

// Pipe the read and write operations
// read input.txt and write data to output.txt
readerStream.pipe(writerStream);

console.log("Program Ended");

Führen Sie nun die Datei main.js aus, um das Ergebnis anzuzeigen.

$ node main.js

Überprüfen Sie die Ausgabe.

Program Ended

Öffnen Sie die in Ihrem aktuellen Verzeichnis erstellte Datei output.txt. es sollte folgendes enthalten -

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Verketten der Streams

Die Verkettung ist ein Mechanismus zum Verbinden der Ausgabe eines Streams mit einem anderen Stream und zum Erstellen einer Kette mehrerer Stream-Vorgänge. Es wird normalerweise bei Rohrleitungen verwendet. Jetzt verwenden wir Piping und Verkettung, um zuerst eine Datei zu komprimieren und dann dieselbe zu dekomprimieren.

Erstellen Sie eine js-Datei mit dem Namen main.js mit dem folgenden Code:

var fs = require("fs");
var zlib = require('zlib');

// Compress the file input.txt to input.txt.gz
fs.createReadStream('input.txt')
   .pipe(zlib.createGzip())
   .pipe(fs.createWriteStream('input.txt.gz'));
  
console.log("File Compressed.");

Führen Sie nun die Datei main.js aus, um das Ergebnis anzuzeigen.

$ node main.js

Überprüfen Sie die Ausgabe.

File Compressed.

Sie werden feststellen, dass input.txt komprimiert wurde und eine Datei input.txt.gz im aktuellen Verzeichnis erstellt wurde. Versuchen wir nun, dieselbe Datei mit dem folgenden Code zu dekomprimieren:

var fs = require("fs");
var zlib = require('zlib');

// Decompress the file input.txt.gz to input.txt
fs.createReadStream('input.txt.gz')
   .pipe(zlib.createGunzip())
   .pipe(fs.createWriteStream('input.txt'));
  
console.log("File Decompressed.");

Führen Sie nun die Datei main.js aus, um das Ergebnis anzuzeigen.

$ node main.js

Überprüfen Sie die Ausgabe.

File Decompressed.