En aquest tema, aprendrem sobre els streams en Node.js, una característica poderosa que permet processar dades de manera eficient i escalable. Els streams són una abstracció per treballar amb dades que arriben de manera contínua, com fitxers, xarxes, o qualsevol altra font de dades.

Què són els Streams?

Els streams són objectes que permeten llegir o escriure dades de manera seqüencial. Hi ha quatre tipus principals de streams en Node.js:

  1. Readable Streams: Streams des dels quals es poden llegir dades.
  2. Writable Streams: Streams als quals es poden escriure dades.
  3. Duplex Streams: Streams que són tant llegibles com escrivibles.
  4. Transform Streams: Streams que poden modificar o transformar les dades mentre passen a través d'ells.

Avantatges dels Streams

  • Eficiència de Memòria: Els streams permeten processar dades en trossos petits, evitant la necessitat de carregar tot el contingut a la memòria.
  • Rendiment: Els streams poden començar a processar dades immediatament, sense esperar que tot el contingut estigui disponible.
  • Escalabilitat: Els streams són ideals per treballar amb grans volums de dades o fonts de dades contínues.

Exemple Pràctic: Llegir un Fitxer amb Streams

A continuació, veurem com llegir un fitxer utilitzant un readable stream.

const fs = require('fs');

// Crear un readable stream
const readableStream = fs.createReadStream('example.txt', {
  encoding: 'utf8',
  highWaterMark: 16 * 1024 // 16KB
});

// Gestionar l'esdeveniment 'data'
readableStream.on('data', (chunk) => {
  console.log('Chunk received:', chunk);
});

// Gestionar l'esdeveniment 'end'
readableStream.on('end', () => {
  console.log('No more data.');
});

// Gestionar l'esdeveniment 'error'
readableStream.on('error', (err) => {
  console.error('Error:', err);
});

Explicació del Codi

  • fs.createReadStream: Crea un readable stream per al fitxer example.txt.
  • encoding: Especifica la codificació del fitxer (en aquest cas, utf8).
  • highWaterMark: Defineix la mida del buffer (en aquest cas, 16KB).
  • 'data': Esdeveniment que es dispara quan es rep un tros de dades.
  • 'end': Esdeveniment que es dispara quan no hi ha més dades per llegir.
  • 'error': Esdeveniment que es dispara si hi ha un error durant la lectura.

Exemple Pràctic: Escriure en un Fitxer amb Streams

Ara veurem com escriure dades en un fitxer utilitzant un writable stream.

const fs = require('fs');

// Crear un writable stream
const writableStream = fs.createWriteStream('output.txt');

// Escriure dades al stream
writableStream.write('Hello, ');
writableStream.write('world!\n');

// Finalitzar el stream
writableStream.end();

// Gestionar l'esdeveniment 'finish'
writableStream.on('finish', () => {
  console.log('All data has been written.');
});

// Gestionar l'esdeveniment 'error'
writableStream.on('error', (err) => {
  console.error('Error:', err);
});

Explicació del Codi

  • fs.createWriteStream: Crea un writable stream per al fitxer output.txt.
  • write: Escriu dades al stream.
  • end: Finalitza el stream, indicant que no hi ha més dades per escriure.
  • 'finish': Esdeveniment que es dispara quan totes les dades han estat escrites.
  • 'error': Esdeveniment que es dispara si hi ha un error durant l'escriptura.

Exercici Pràctic

Exercici 1: Llegir i Escriure Fitxers amb Streams

  1. Crea un fitxer anomenat input.txt amb el contingut següent:

    Node.js és una plataforma de programació asíncrona basada en l'event loop.
    
  2. Escriu un programa que llegeixi el contingut de input.txt utilitzant un readable stream i l'escrigui en un nou fitxer anomenat output.txt utilitzant un writable stream.

Solució

const fs = require('fs');

// Crear un readable stream
const readableStream = fs.createReadStream('input.txt', {
  encoding: 'utf8',
  highWaterMark: 16 * 1024 // 16KB
});

// Crear un writable stream
const writableStream = fs.createWriteStream('output.txt');

// Llegir dades del readable stream i escriure-les al writable stream
readableStream.on('data', (chunk) => {
  writableStream.write(chunk);
});

// Finalitzar el writable stream quan el readable stream acaba
readableStream.on('end', () => {
  writableStream.end();
  console.log('Data has been copied from input.txt to output.txt');
});

// Gestionar errors
readableStream.on('error', (err) => {
  console.error('Error reading input.txt:', err);
});

writableStream.on('error', (err) => {
  console.error('Error writing to output.txt:', err);
});

Conclusió

Els streams són una eina poderosa en Node.js per treballar amb dades de manera eficient i escalable. Hem après a crear i utilitzar readable i writable streams per llegir i escriure fitxers. En el proper tema, explorarem el mòdul del sistema de fitxers en més detall.

Curs de Node.js

Mòdul 1: Introducció a Node.js

Mòdul 2: Conceptes Bàsics

Mòdul 3: Sistema de Fitxers i I/O

Mòdul 4: HTTP i Servidors Web

Mòdul 5: NPM i Gestió de Paquets

Mòdul 6: Framework Express.js

Mòdul 7: Bases de Dades i ORMs

Mòdul 8: Autenticació i Autorització

Mòdul 9: Proves i Depuració

Mòdul 10: Temes Avançats

Mòdul 11: Desplegament i DevOps

Mòdul 12: Projectes del Món Real

© Copyright 2024. Tots els drets reservats