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.