Nodejs streams
Stream VS Buffer
Ambos são termos utilizados para processamento de dados, vamos ver qual a diferença ?
Stream:
- Uma stream é uma sequência de elementos de dados disponibilizados ao longo do tempo
- É um fluxo contínuo de dados que é processado ou consumido pedaço por pedaço.
- Streams são comumente usadas para operações de entrada e saída, onde os dados são lidos de uma fonte ou gravados em uma fonte de forma contínua.
- Na programação, streams podem representar várias fontes ou destinos de dados, como arquivos, conexões de rede ou até mesmo estruturas de dados em memória.
Exemplo de stream em nodejs
const fs = require('node:fs')
const stream = fs.createReadStream('exemplo.txt', 'utf-8');
stream.on('data', (pedaço) => console.log(pedaço))
stream.on('end', () => console.log('Leitura concluida'))
Buffer:
- Um buffer é uma área de armazenamento temporário usada para manter dados enquanto estão sendo transferidos de um lugar para outro.
- Buffers são frequentemente utilizados para gerenciar o fluxo de dados entre dois processos ou componentes que operam em velocidades diferentes ou de maneiras diferentes.
- No contexto de operações de entrada/saída, um buffer pode ser usado para armazenar uma certa quantidade de dados antes que esses dados sejam lidos da stream subjacente ou gravados nela.
Exemplo de buffer:
const fs = require('fs')
const buffer = Buffer.alloc(100) // Cria um buffer de 100 bytes
const arquivoEntrada = fs.openSync('exemplo.txt', 'r')
const bytesRead = fs.readSync(arquivoEntrada, buffer, 0, buffer.length, null)
console.log(buffer.toString('utf-8', 0, bytesRead))
fs.closeSync(arquivoEntrada)
O que são as Readable, Writable e Transform do nodejs ?
-
Readable Stream
- Uma
Readable
stream é uma fonte de dados que pode ser lida por outros processos – Exemplo Pratico: * Imagine m servidor HTTP que transmite continuamente um dados para o cliente conforme eles estão disponiveis. Neste exemplo, aReadable
stream poderia ser os dados que o servidor está enviado para o cliente.
- Uma
-
Writable Stream
- Uma
Writable
stream representa um destino onde os dados podem ser escritos. - Exemplo: Considere um serviço de log que grava registros em um banco de dados e simultaneamente envia notificações para um sistema de monitoramento. A
Writable
stream poderia ser usada para escrever esse registro e enviar para o destino
- Uma
-
Transform Stream
- Uma
Transform
stream é uma combinação deReadable
eWritable
. Ela recebe dados, realiza uma transformação e os emite para um destino. - Exemplo: Suponha que vc esteja construindo um serviço de compressão/descompressão para arquivos em tempo real. A
Transform
stream poderia ser usada para comprimir dados antes de escreve-los e descomprimir dados antes de lê-los.
- Uma
Exemplo de como usar o que foi explicado a cima.
import { createReadStream, createWriteStream } from 'node:fs'
import { Transform, Writable, pipeline } from 'node:stream'
// createReadStream ja retorna um Readable stream do arquivo lido
const readableStream = createReadStream('input.txt')
// Instancia do transform que recebe um os chunks e os modifica
const transformStream = new Transform({
transform(chunk, encoding, callback) {
const uppercased = chunk.toString().toUpperCase()
this.push(uppercased)
callback()
}
})
// Instancia do Writable que conectar os salvas os chunks em algum lugar
const writableStream = new Writable({
write(chunk, encoding, callback) {
createWriteStream('output.txt', {flags: 'a'}).write(chunk)
callback()
}
})
// pipeline faz o trajeto # Esse exemplo é sincrono.
pipeline(
readableStream,
transformStream,
writableStream,
(err) => {
if (err) {
console.error('Error durante a pipeline sincrona:', err)
} else {
console.log('Pipeline sincrono concluido')
}
}
)