Node.js - strumienie

Co to są strumienie?

Strumienie to obiekty, które umożliwiają ciągłe odczytywanie danych ze źródła lub zapisywanie danych w miejscu docelowym. W Node.js istnieją cztery typy strumieni -

  • Readable - Strumień używany do operacji odczytu.

  • Writable - Strumień używany do operacji zapisu.

  • Duplex - Strumień, który może być używany do odczytu i zapisu.

  • Transform - Typ strumienia dupleksowego, w którym dane wyjściowe są obliczane na podstawie danych wejściowych.

Każdy typ strumienia to plik EventEmitterinstancja i wyrzuca kilka zdarzeń w różnych momentach. Na przykład niektóre z powszechnie używanych zdarzeń to -

  • data - To zdarzenie jest uruchamiane, gdy dostępne są dane do odczytania.

  • end - To zdarzenie jest uruchamiane, gdy nie ma więcej danych do odczytania.

  • error - To zdarzenie jest uruchamiane, gdy wystąpi błąd podczas odbierania lub zapisywania danych.

  • finish - To zdarzenie jest wywoływane, gdy wszystkie dane zostały usunięte do systemu bazowego.

W tym samouczku przedstawiono podstawowe informacje na temat często używanych operacji na strumieniach.

Czytanie ze strumienia

Utwórz plik tekstowy o nazwie input.txt o następującej zawartości -

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

Utwórz plik js o nazwie main.js z następującym kodem -

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

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

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

Pisanie do strumienia

Utwórz plik js o nazwie main.js z następującym kodem -

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

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

Program Ended
Write completed.

Teraz otwórz plik output.txt utworzony w bieżącym katalogu; powinien zawierać:

Simply Easy Learning

Orurowanie strumieni

Piping to mechanizm, w którym dane wyjściowe jednego strumienia są dostarczane jako dane wejściowe do innego strumienia. Zwykle jest używany do pobierania danych z jednego strumienia i przekazywania danych wyjściowych tego strumienia do innego strumienia. Nie ma ograniczeń co do operacji związanych z rurociągami. Teraz pokażemy przykład potoku do odczytu z jednego pliku i zapisania go do innego.

Utwórz plik js o nazwie main.js z następującym kodem -

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

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

Program Ended

Otwórz plik output.txt utworzony w bieżącym katalogu; powinien zawierać:

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

Łańcuch strumieni

Łańcuch to mechanizm łączenia danych wyjściowych jednego strumienia z innym strumieniem i tworzenia łańcucha operacji wielostrumieniowych. Zwykle jest używany do operacji związanych z rurociągami. Teraz użyjemy potoków i łańcuchów, aby najpierw skompresować plik, a następnie go zdekompresować.

Utwórz plik js o nazwie main.js z następującym kodem -

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

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

File Compressed.

Przekonasz się, że plik input.txt został skompresowany i utworzył plik input.txt.gz w bieżącym katalogu. Teraz spróbujmy zdekompresować ten sam plik przy użyciu następującego kodu -

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

Teraz uruchom plik main.js, aby zobaczyć wynik -

$ node main.js

Sprawdź dane wyjściowe.

File Decompressed.