Node.js Streams são um recurso essencial para lidar com grandes quantidades de dados com eficiência. Ao contrário dos mecanismos tradicionais de entrada-saída, os fluxos permitem que os dados sejam processados em partes, em vez de carregar os dados inteiros na memória, tornando-os perfeitos para lidar com arquivos grandes ou dados em tempo real. Neste artigo, vamos nos aprofundar no que são streams Node.js, por que são úteis, como implementá-los e vários tipos de streams com exemplos detalhados e casos de uso.
Em termos simples, um fluxo é uma sequência de dados sendo movidos de um ponto para outro ao longo do tempo. Você pode pensar nisso como uma esteira rolante onde os dados fluem peça por peça, em vez de todos de uma vez.
Os fluxos Node.js funcionam de maneira semelhante; eles permitem que você leia e grave dados em pedaços (em vez de todos de uma vez), tornando-os altamente eficientes em termos de memória.
Streams em Node.js são construídos sobre EventEmitter, tornando-os orientados a eventos. Alguns eventos importantes incluem:
Streams oferecem diversas vantagens sobre métodos tradicionais como fs.readFile() ou fs.writeFile() para lidar com E/S:
Existem quatro tipos de streams no Node.js:
Vamos examinar cada tipo com exemplos.
Streams legíveis são usados para ler dados pedaço por pedaço. Por exemplo, ao ler um arquivo grande, usar um fluxo legível nos permite ler pequenos pedaços de dados na memória em vez de carregar o arquivo inteiro.
const fs = require('fs'); // Create a readable stream const readableStream = fs.createReadStream('largefile.txt', { encoding: 'utf8' }); // Listen for data events and process chunks readableStream.on('data', (chunk) => { console.log('Chunk received:', chunk); }); // Listen for the end event when no more data is available readableStream.on('end', () => { console.log('No more data.'); }); // Handle error event readableStream.on('error', (err) => { console.error('Error reading the file:', err); });
Explicação:
Streams graváveis são usados para gravar dados pedaço por pedaço. Em vez de gravar todos os dados de uma vez, você pode transmiti-los para um arquivo ou outro destino gravável.
const fs = require('fs'); // Create a writable stream const writableStream = fs.createWriteStream('output.txt'); // Write chunks to the writable stream writableStream.write('Hello, World!\n'); writableStream.write('Streaming data...\n'); // End the stream (important to avoid hanging the process) writableStream.end('Done writing.\n'); // Listen for the finish event writableStream.on('finish', () => { console.log('Data has been written to output.txt'); }); // Handle error event writableStream.on('error', (err) => { console.error('Error writing to the file:', err); });
Explicação:
Streams duplex podem ler e gravar dados. Um exemplo típico de fluxo duplex é um soquete de rede, onde você pode enviar e receber dados simultaneamente.
const { Duplex } = require('stream'); const duplexStream = new Duplex({ write(chunk, encoding, callback) { console.log(`Writing: ${chunk.toString()}`); callback(); }, read(size) { this.push('More data'); this.push(null); // End the stream } }); // Write to the duplex stream duplexStream.write('Hello Duplex!\n'); // Read from the duplex stream duplexStream.on('data', (chunk) => { console.log(`Read: ${chunk}`); });
Explicação:
Transform streams modificam os dados à medida que passam pelo stream. Por exemplo, um fluxo de transformação pode compactar, criptografar ou manipular dados.
const { Transform } = require('stream'); // Create a transform stream that converts data to uppercase const transformStream = new Transform({ transform(chunk, encoding, callback) { this.push(chunk.toString().toUpperCase()); callback(); } }); // Pipe input to transform stream and then output the result process.stdin.pipe(transformStream).pipe(process.stdout);
Explicação:
Um dos principais recursos dos streams Node.js é sua capacidade de serem canalizados. A tubulação permite encadear fluxos, passando a saída de um fluxo como entrada para outro.
const fs = require('fs'); // Create a readable stream for the input file const readableStream = fs.createReadStream('input.txt'); // Create a writable stream for the output file const writableStream = fs.createWriteStream('output.txt'); // Pipe the readable stream into the writable stream readableStream.pipe(writableStream); // Handle errors readableStream.on('error', (err) => console.error('Read error:', err)); writableStream.on('error', (err) => console.error('Write error:', err));
Explicação:
Node.js fornecem uma maneira poderosa e eficiente de lidar com operações de E/S, trabalhando com dados em blocos. Esteja você lendo arquivos grandes, canalizando dados entre fontes ou transformando dados dinamicamente, os streams oferecem uma solução com desempenho e eficiência de memória. Compreender como aproveitar fluxos legíveis, graváveis, duplex e de transformação em seu aplicativo pode melhorar significativamente o desempenho e a escalabilidade do seu aplicativo.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3