Node.js: transmisiones

¿Qué son las corrientes?

Los flujos son objetos que le permiten leer datos de una fuente o escribir datos en un destino de manera continua. En Node.js, hay cuatro tipos de transmisiones:

  • Readable - Stream que se utiliza para la operación de lectura.

  • Writable - Secuencia que se utiliza para la operación de escritura.

  • Duplex - Secuencia que se puede utilizar para operaciones de lectura y escritura.

  • Transform - Un tipo de flujo dúplex donde la salida se calcula en función de la entrada.

Cada tipo de Stream es un EventEmitterinstancia y lanza varios eventos en diferentes instancias de momentos. Por ejemplo, algunos de los eventos de uso común son:

  • data - Este evento se activa cuando hay datos disponibles para leer.

  • end - Este evento se activa cuando no hay más datos para leer.

  • error - Este evento se dispara cuando hay algún error al recibir o escribir datos.

  • finish - Este evento se activa cuando todos los datos se han vaciado al sistema subyacente.

Este tutorial proporciona una comprensión básica de las operaciones de uso común en Streams.

Leer de una corriente

Cree un archivo de texto llamado input.txt que tenga el siguiente contenido:

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

Cree un archivo js llamado main.js con el siguiente código:

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

Ahora ejecute main.js para ver el resultado:

$ node main.js

Verifique la salida.

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

Escribir en una secuencia

Cree un archivo js llamado main.js con el siguiente código:

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

Ahora ejecute main.js para ver el resultado:

$ node main.js

Verifique la salida.

Program Ended
Write completed.

Ahora abra output.txt creado en su directorio actual; debe contener lo siguiente:

Simply Easy Learning

Canalizando los arroyos

La canalización es un mecanismo en el que proporcionamos la salida de un flujo como entrada a otro flujo. Normalmente se utiliza para obtener datos de un flujo y pasar la salida de ese flujo a otro flujo. No hay límite para las operaciones de tuberías. Ahora mostraremos un ejemplo de canalización para leer de un archivo y escribirlo en otro archivo.

Cree un archivo js llamado main.js con el siguiente código:

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

Ahora ejecute main.js para ver el resultado:

$ node main.js

Verifique la salida.

Program Ended

Abra output.txt creado en su directorio actual; debe contener lo siguiente:

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

Encadenando las corrientes

El encadenamiento es un mecanismo para conectar la salida de un flujo a otro flujo y crear una cadena de múltiples operaciones de flujo. Normalmente se utiliza con operaciones de tuberías. Ahora usaremos la canalización y el encadenamiento para primero comprimir un archivo y luego descomprimirlo.

Cree un archivo js llamado main.js con el siguiente código:

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

Ahora ejecute main.js para ver el resultado:

$ node main.js

Verifique la salida.

File Compressed.

Encontrará que input.txt ha sido comprimido y creó un archivo input.txt.gz en el directorio actual. Ahora intentemos descomprimir el mismo archivo usando el siguiente código:

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

Ahora ejecute main.js para ver el resultado:

$ node main.js

Verifique la salida.

File Decompressed.