Node.js: flussi

Cosa sono gli stream?

I flussi sono oggetti che consentono di leggere dati da un'origine o scrivere dati in una destinazione in modo continuo. In Node.js, ci sono quattro tipi di stream:

  • Readable - Stream che viene utilizzato per l'operazione di lettura.

  • Writable - Stream utilizzato per operazioni di scrittura.

  • Duplex - Stream che può essere utilizzato sia per operazioni di lettura che per operazioni di scrittura.

  • Transform - Un tipo di flusso duplex in cui l'output viene calcolato in base all'input.

Ogni tipo di Stream è un file EventEmitteristanza e genera diversi eventi in diverse istanze di volte. Ad esempio, alcuni degli eventi comunemente usati sono:

  • data - Questo evento viene generato quando sono disponibili dati per la lettura.

  • end - Questo evento viene generato quando non ci sono più dati da leggere.

  • error - Questo evento viene generato quando si verifica un errore durante la ricezione o la scrittura dei dati.

  • finish - Questo evento viene generato quando tutti i dati sono stati scaricati nel sistema sottostante.

Questo tutorial fornisce una comprensione di base delle operazioni comunemente utilizzate su Streams.

Lettura da un flusso

Crea un file di testo denominato input.txt con il seguente contenuto:

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

Crea un file js denominato main.js con il codice seguente:

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

Ora esegui main.js per vedere il risultato -

$ node main.js

Verifica l'output.

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

Scrivere su un flusso

Crea un file js denominato main.js con il codice seguente:

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

Ora esegui main.js per vedere il risultato -

$ node main.js

Verifica l'output.

Program Ended
Write completed.

Ora apri output.txt creato nella tua directory corrente; dovrebbe contenere quanto segue:

Simply Easy Learning

Piping the Streams

Il piping è un meccanismo in cui forniamo l'output di un flusso come input per un altro flusso. Viene normalmente utilizzato per ottenere dati da un flusso e per passare l'output di tale flusso a un altro flusso. Non ci sono limiti alle operazioni di tubazioni. Ora mostreremo un esempio di piping per leggere da un file e scriverlo su un altro file.

Crea un file js denominato main.js con il codice seguente:

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

Ora esegui main.js per vedere il risultato -

$ node main.js

Verifica l'output.

Program Ended

Apri output.txt creato nella tua directory corrente; dovrebbe contenere quanto segue:

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

Concatenamento dei flussi

Il concatenamento è un meccanismo per connettere l'output di un flusso a un altro flusso e creare una catena di più operazioni di flusso. Viene normalmente utilizzato con operazioni di tubazioni. Ora useremo piping e chaining per comprimere prima un file e poi decomprimerlo.

Crea un file js denominato main.js con il codice seguente:

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

Ora esegui main.js per vedere il risultato -

$ node main.js

Verifica l'output.

File Compressed.

Scoprirai che input.txt è stato compresso e ha creato un file input.txt.gz nella directory corrente. Ora proviamo a decomprimere lo stesso file usando il seguente codice:

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

Ora esegui main.js per vedere il risultato -

$ node main.js

Verifica l'output.

File Decompressed.