Desde que comecei a trabalhar com Node, a uns 2 anos, buscava entender uma coisa: Stream. Até um certo momento, não era uma coisa útil pra mim, mas depois de conhecer essa abstração, acho que é impossível programar no Node.js sem conhece-la bem. Falei que tinha uma abstração, mas na realidade são duas. Streams de leitura (ReadStream), e de escrita (WriteStream). Eles são implementados ao longo de muitos objetos Node e representam o fluxo de entrada e saída de dados. Se você trabalha com Node.js, já deve ter trombado com stream por ai.
ReadStream
Vamos imaginar que ReadStream seria uma torneira de dados. E depois que voce criar uma, voce pode:
Esperar por dado
Ao conecta-lo com o evento de "data" você sera notificado toda vez que um "pedaço" (formalmente conhecido como chunk
) for entregue pela nossa stream. Essas entregas podem ser feitas como buffer ou string.
1 var streamDeLeitura = ...
2 streamDeLeitura.on('data', function(data) {
3 //Aqui data é um buffer
4 });
5
6 var streamDeLeitura = ...
7 streamDeLeitura.setEncoding('utf8')
8 streamDeLeitura.on('data', function(data) {
9 //Aqui data é uma string
10 });
Saber quando acaba
Você nunca sabe quando a agua da torneira vai acabar, mas as streams sim, e você pode saber quando isso ocorre escutando o evento end
, tipo assim:
1 var streamDeLeitura = ...
2 streamDeLeitura.on('end', function() {
3 console.log("A stream e a agua da torneira acabaram :P");
4 });
Pausar e resumir
Você pode pausar uma stream tão facilmente quanto fechar uma torneira.
1 readStream.pause();
Para resumir, é tão simples quanto isso:
1 readStream.resume();
WriteStream
Uma stream de escrita, formalmente conhecida como WriteStream
, é conhecida por enviar ou escrever dados. Podendo ser uma conexão com a rede ou um arquivo. Com uma WriteStream podemos:
Escreve nela
Você pode escrever um buffer ou uma string chamando write
:
1 var streamDeEscrita = ...
2 streamDeEscrita.write('isso é uma string com encoding UTF8');
Nesse ponto, o Node assume que nos passamos uma string com encoding UTF-8. Mas você pode especificar um outro encoding, assim:
1 var streamDeEscrita = ...
2 streamDeEscrita.write('T2xhciwgdGFpcj8gdG9yIQ==', 'base64');
Alguns exemplos de Streams
Vamos ver um pouco delas no mundo real. Streams do sistema de arquivos Você pode criar uma stream de leitura de um arquivo fazendo assim:
1 var fs = requeire('fs')
2 var rs = fs.createReadStream('arquivo.txt', {encoding: 'utf8'})
Aqui lemos um arquivo com encoding UTF8 através de uma stream. E para gravar nele, é bem simples:
1 var fs = require('fs');
2 var ws = fs.createWriteStream('arquivo.txt' , {encoding: 'utf8'});
Bom e assim termino esse post basico e já deu pra ver um pouco do poder das Streams. Você pode saber mais por aqui: http://nodejs.org/api/stream.html. Em breve voltarei e falarei de back pressure e pipe.