Ein Stream ist eine Art der Datenverarbeitung, die uns hilft, eine sequentielle Ausgabe zu erhalten, indem die Eingabe gelesen oder geschrieben wird (Dateien, Netzwerkkommunikation und jede Art von End-to-End-Informationsaustausch). Das heißt, sie ermöglichen es Ihnen, Daten von einer Quelle zu lesen oder an ein Ziel zu schreiben oder andere spezifische Aufgaben ununterbrochen und konstant auszuführen. Der Stream ist kein einzigartiges Konzept für Node.js und seit geraumer Zeit ein Teil von Unix. Ein Pipe-Operator wird verwendet, um die Programme miteinander reagieren zu lassen, indem Streams weitergegeben werden. Daher wird der Node.js-Stream als Grundlage für alle Streaming-APIs verwendet.

Beispiel: Wenn Sie YouTube, Netflix oder Spotify streamen, wird nicht der gesamte Inhalt auf einmal heruntergeladen, sondern in kleinen Stücken, während Sie weiter surfen. Ein weiteres Beispiel kann das Chatten auf Facebook oder WhatsApp sein, wo die Daten kontinuierlich zwischen zwei Personen fließen.
Dies liegt daran, dass der Stream nicht alle Daten auf einmal in den Speicher liest, sondern sie in kleinere Teile verarbeitet, um große Dateien leicht lesbar zu machen. Dies ist nützlich, da einige Dateien größer sind als der verfügbare freie Speicherplatz, den Sie auf Ihrem Gerät haben. Daher macht der Stream solche Dateien lesbar.

Vorteile von Stream:

  1. Speichereffizienz: Stream ist speicher(räumlich) effizient, da sie es Ihnen ermöglichen, Dateien in kleineren Blöcken statt als Ganzes in den Speicher herunterzuladen, bevor Sie sie verarbeiten können, wodurch Platz gespart wird.
  2. Zeiteffizienz: Stream ist zeiteffizient, da Sie mit der Verarbeitung der Daten in kleineren Blöcken beginnen, sodass der Vorgang früher beginnt als bei der allgemeinen Methode, bei der Sie die gesamten Daten herunterladen müssen, um sie verarbeiten zu können. Daher spart diese frühe Verarbeitung viel Zeit.
  3. Zusammensetzbare Daten: Daten werden aufgrund der Rohrleitungsfähigkeit der Ströme zusammengestellt, wodurch sie sich trotz schwerer Codes miteinander verbinden können. Dies bedeutet, dass der Prozess, bei dem ein Eingang zum Ausgang geleitet wird, weitergeht.

Arten von Streams:

  1. Lesbarer Stream: Dies ist der Stream, von dem Sie die Daten in geordneter Weise empfangen und lesen können. Sie dürfen jedoch nichts versenden. Zum Beispiel lässt uns fs.createReadStream() den Inhalt einer Datei lesen.
  2. Beschreibbarer Stream: Dies ist der Stream, in dem Sie Daten auf geordnete Weise senden können, aber Sie dürfen sie nicht zurückerhalten. Mit fs.createWriteStream() können wir beispielsweise Daten in eine Datei schreiben.
  3. Duplex-Stream: Es ist der Stream, der sowohl lesbar als auch beschreibbar ist. So können Sie Daten zusammen senden und empfangen. Zum Beispiel ist net.Socket ein TCP-Socket.
  4. Transform-Stream: Es ist der Stream, der verwendet wird, um die Daten zu ändern oder sie beim Lesen umzuwandeln. Der Transformationsstrom ist im Grunde von Natur aus duplex. Zum Beispiel wird zlib.createGzip stream verwendet, um die Daten mit gzip zu komprimieren.

Verschiedene Operationen in einem Stream sind:

  1. Lesen aus einem Stream: Erstellen Sie eine Datei namens input.txt mit folgendem Text:
    Dies ist ein Code, um mehr über das Lesen aus einem Stream zu erfahren.

    Dateiname: main.js




    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"); 
       
    // Handling data stream event
    readerStream.on("data", function(chunk) { 
        data += chunk; 
    }); 
       
    // Handling end stream event
    readerStream.on("end",function() { 
        console.log(data); 
    }); 
       
    // Handling error stream event
    readerStream.on("error", function(err) { 
        console.log(err.stack); 
    }); 

    Führen Sie die Datei main.js mit dem folgenden Befehl aus:

    $node main.js

    Die Ausgabe des obigen Befehls ist unten dargestellt:

    Dies ist ein Code, um etwas über das Lesen aus einem Stream zu erfahren.
  2. Schreiben in einen Stream

    Dateiname: main.js




       
    var fs = require('fs');
    var data = 'This is a code to learn"
        + " about writing in a stream.';
      
    // 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();
      
    // Handling finish stream event
    writerStream.on('finish', function () {
    });
      
    // Handling error stream event
    writerStream.on('error', function (err) {
        console.log(err.stack);
    });  

    Führen Sie die Datei main.js mit dem folgenden Befehl aus:

    $node main.js

    Nach dem Ausführen des obigen Befehls wird im aktuellen Verzeichnis eine Datei namens output.txt mit folgendem Text erstellt:



    Dies ist ein Code zum Erlernen des Schreibens in einem Stream.
  3. Piping des Streams: Piping ist eine Operation oder ein Mechanismus, bei dem wir die Ausgabe eines Streams (lesbar, dh die Quelldatei) von Daten als Eingabe für einen anderen Stream (schreibfähig, dh die Zieldatei) bereitstellen. Es wird normalerweise verwendet, um Daten von einem Stream zu erhalten (dh von der Quelle zu lesen) und die Ausgabe dieses Streams an einen anderen Stream weiterzuleiten (dh zum Ziel zu schreiben), ohne den Fluss selbst zu verwalten. Es ist der einfachste Weg, Streams zu konsumieren. Es gibt keine Begrenzung für den Rohrleitungsbetrieb. Es wird verwendet, um gestreamte Daten auf verschiedene Weise zu verarbeiten. Zum Beispiel aus einer Datei lesen und in eine andere schreiben.

    Erstellen Sie eine Datei namens input.txt mit folgendem Text:

    Dies ist ein Code zum Erlernen der Weiterleitung des Streams.

    Dateiname: main.js




    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); 

    Führen Sie die Datei main.js mit dem folgenden Befehl aus:

    $node main.js

    Nach dem Ausführen des obigen Befehls wird eine Datei mit dem Namen output.txt im aktuellen Verzeichnis mit dem folgenden Text erstellt:

    Dies ist ein Code zum Erlernen der Weiterleitung des Streams.
  4. Verketten des Streams: Das Verketten des Streams ist ein Mechanismus zum Erstellen einer Kette mehrerer Stream-Vorgänge, indem die Ausgabe eines Streams mit einem anderen Stream verbunden wird. Es wird normalerweise bei Rohrleitungsarbeiten verwendet. Zum Beispiel verwenden wir Piping und Chaining, um eine Datei zuerst zu komprimieren und dann zu dekomprimieren.

    Dateiname: main.js




    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 die Datei main.js mit dem folgenden Befehl aus:

    $node main.js

    Die Ausgabe des obigen Befehls ist unten dargestellt:

    Datei komprimiert.

    Sie werden feststellen, dass input.txt komprimiert wurde und eine Datei input.txt.gz im aktuellen Verzeichnis erstellt wurde.

    Der Code zum Dekomprimieren der oben erstellten Datei wird unten angezeigt:
    Dateiname: main.js




    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 die Datei main.js mit dem folgenden Befehl aus:

    $node main.js

    Die Ausgabe des obigen Befehls ist unten dargestellt:

    Datei dekomprimiert.

    Sie werden feststellen, dass input.txt.gz dekomprimiert wurde.