Node.js - Streams

O que são streams?

Streams são objetos que permitem ler dados de uma origem ou gravar dados em um destino de maneira contínua. No Node.js, existem quatro tipos de streams -

  • Readable - Fluxo que é usado para operação de leitura.

  • Writable - Fluxo que é usado para operação de gravação.

  • Duplex - Fluxo que pode ser usado para operação de leitura e gravação.

  • Transform - Um tipo de fluxo duplex em que a saída é calculada com base na entrada.

Cada tipo de fluxo é um EventEmitterinstância e lança vários eventos em diferentes instâncias de tempos. Por exemplo, alguns dos eventos comumente usados ​​são -

  • data - Este evento é disparado quando há dados disponíveis para leitura.

  • end - Este evento é disparado quando não há mais dados para ler.

  • error - Este evento é disparado quando ocorre algum erro ao receber ou gravar dados.

  • finish - Este evento é disparado quando todos os dados são liberados para o sistema subjacente.

Este tutorial fornece uma compreensão básica das operações comumente usadas no Streams.

Lendo de um fluxo

Crie um arquivo de texto denominado input.txt com o seguinte conteúdo -

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

Crie um arquivo js chamado main.js com o seguinte 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");

Agora execute o main.js para ver o resultado -

$ node main.js

Verifique a saída.

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

Escrevendo em um fluxo

Crie um arquivo js chamado main.js com o seguinte 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");

Agora execute o main.js para ver o resultado -

$ node main.js

Verifique a saída.

Program Ended
Write completed.

Agora abra output.txt criado em seu diretório atual; deve conter o seguinte -

Simply Easy Learning

Canalizando os córregos

Piping é um mecanismo em que fornecemos a saída de um fluxo como entrada para outro fluxo. Normalmente é usado para obter dados de um fluxo e passar a saída desse fluxo para outro fluxo. Não há limite para operações de tubulação. Agora mostraremos um exemplo de tubulação para ler de um arquivo e gravá-lo em outro arquivo.

Crie um arquivo js chamado main.js com o seguinte 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");

Agora execute o main.js para ver o resultado -

$ node main.js

Verifique a saída.

Program Ended

Abra output.txt criado em seu diretório atual; deve conter o seguinte -

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

Encadeando os Streams

O encadeamento é um mecanismo para conectar a saída de um fluxo a outro fluxo e criar uma cadeia de múltiplas operações de fluxo. Normalmente é usado com operações de tubulação. Agora, usaremos o encadeamento e o encadeamento para primeiro compactar um arquivo e depois descompactar o mesmo.

Crie um arquivo js chamado main.js com o seguinte 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.");

Agora execute o main.js para ver o resultado -

$ node main.js

Verifique a saída.

File Compressed.

Você descobrirá que o input.txt foi compactado e criou um arquivo input.txt.gz no diretório atual. Agora vamos tentar descompactar o mesmo arquivo usando o seguinte 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.");

Agora execute o main.js para ver o resultado -

$ node main.js

Verifique a saída.

File Decompressed.