Inicio > Cursos > Node.js y Express > Streams y Buffers
Node.js y ExpressNode.js CoreLección 3 de 20

Streams y Buffers

Los Streams permiten procesar datos en trozos (chunks) en lugar de cargarlos todos en memoria. Son fundamentales para manejar archivos grandes, respuestas HTTP, y datos en tiempo real. Hay 4 tipos: Readable (leer), Writable (escribir), Duplex (ambos) y Transform (transforma mientras pasa).

const fs = require('fs');
const { Transform } = require('stream');

// ❌ Esto carga 1GB completo en RAM
// const data = fs.readFileSync('archivo-1gb.csv');

// ✅ Stream: procesa chunk por chunk, usa ~64KB de RAM
const readable = fs.createReadStream('archivo-1gb.csv', {
  encoding: 'utf8',
  highWaterMark: 64 * 1024 // tamaño del chunk: 64KB
});

const writable = fs.createWriteStream('procesado.csv');

// Transform stream personalizado
const mayusculas = new Transform({
  transform(chunk, encoding, callback) {
    // Transforma cada chunk y lo pasa adelante
    this.push(chunk.toString().toUpperCase());
    callback();
  }
});

// pipe() conecta streams en cadena
// lee → transforma → escribe
readable
  .pipe(mayusculas)
  .pipe(writable);

writable.on('finish', () => console.log('¡Procesado sin explotar la RAM!'));
readable.on('error', (err) => console.error('Error de lectura:', err));

// Buffer: secuencia de bytes
const buf = Buffer.from('Hola Node', 'utf8');
console.log(buf);           // <Buffer 48 6f 6c 61 ...>
console.log(buf.toString()); // 'Hola Node'
console.log(buf.length);    // bytes, no caracteres
Consejopipe() maneja automáticamente la contrapresión (backpressure): si el writable es más lento que el readable, pausa el readable para no saturar la memoria. Siempre prefiere pipe() sobre manejar eventos manualmente.
← Módulos y Sistema de ArchivosEventEmitter y Process →

Practica esta lección

Resuelve los ejercicios del curso de Node.js y Express en la app, gratis y con corrección automática.

Empezar a practicar