Curso de Node.js Avanzado

Streams y buffers para leer archivos en Node.js

Curso de Node.js Avanzado

Contenido del curso

Streams y buffers para leer archivos en Node.js

Resumen

Trabajar con archivos grandes o peticiones HTTP en Node.js sin colapsar la memoria depende de dos conceptos fundamentales: streams y buffers. Aquí entenderás qué son, cuándo usarlos y por qué importan para construir aplicaciones eficientes en Node.js.

¿Qué es un buffer en Node.js y para qué sirve?

Un buffer es la representación de un objeto en memoria, es decir, datos binarios que Node.js maneja directamente. Piensa en él como la versión cruda de un texto antes de ser legible para ti.

Un ejemplo rápido en la terminal lo deja claro. Si ejecutas Buffer.from("hola mundo"), Node.js no te devuelve el string: te devuelve la representación binaria de esa cadena en memoria. Y si conviertes ese buffer otra vez a string, recuperas tu texto original.

¿Para qué sirve un buffer? Sirve para representar datos binarios en memoria. Todo el manejo de flujos en Node.js pasa por buffers, así que entenderlos es la base para trabajar con archivos, peticiones HTTP o cualquier flujo de datos.

¿Qué son los streams y por qué cambian la forma de manejar datos?

Los streams son mecanismos que te permiten controlar el flujo de datos de entrada y salida de forma eficiente. Leer un archivo, recibir una petición HTTP o enviar una respuesta son operaciones donde no sabes cuándo terminarán de llegar los datos. Por eso request y response en Node.js son streams.

¿Cuáles son los tipos de streams en Node.js?

Node.js define cuatro tipos según la dirección del flujo:

  • Readable: solo lectura, como leer un archivo.
  • Writable: solo escritura, como escribir a un archivo o a una respuesta HTTP.
  • Duplex: lectura y escritura al mismo tiempo.
  • Transform: recibe un flujo, lo transforma y lo entrega como otro flujo.

Cada tipo resuelve un caso distinto. Si solo necesitas consumir datos, te basta con un readable. Si vas a modificarlos al vuelo, un transform es tu mejor amigo.

¿Cómo leer un archivo con streams en Node.js paso a paso?

Para entender el beneficio, primero piensa en la forma tradicional. Con fs.readFileSync("entrada.txt", "utf-8") lees el archivo completo de una sola vez. Funciona perfecto con un archivo pequeño, pero si ese archivo pesa 500 MB, vas a cargar 500 MB en memoria. El tiempo de espera y el procesamiento se disparan.

La solución es leer por partes con un Read Stream.

¿Cómo crear un Read Stream y escuchar sus eventos?

La lógica es sencilla y se apoya en el patrón EventEmitter que Node.js usa por todos lados:

  1. Crea el stream con fs.createReadStream("entrada.txt").
  2. Escucha el evento data para recibir cada fragmento del archivo a medida que se lee.
  3. Convierte cada fragmento a string con .toString() para evitar problemas si vas a reusar la información.
  4. Escucha el evento end para detectar cuándo terminó la lectura.

El console.log convierte el buffer a string automáticamente, pero si vas a procesar esos datos después, conviértelos a string explícitamente para no arrastrar errores.

¿Cuándo debo usar streams en lugar de readFileSync? Úsalos cuando trabajes con archivos grandes, peticiones HTTP o cualquier flujo donde no quieras cargar todo en memoria. Con streams procesas los datos por partes y mantienes el consumo bajo.

¿Qué eventos clave debes conocer al trabajar con streams?

Dos eventos te resuelven la mayoría de los casos básicos:

  • data: se dispara cada vez que el stream lee una porción del archivo o recibe un fragmento del flujo.
  • end: se dispara cuando el stream terminó de leer todo el contenido.

Con estos dos eventos ya puedes leer archivos grandes sin saturar la memoria, procesar peticiones HTTP por partes o encadenar transformaciones sobre los datos.

La idea central es esta: en vez de pedir todo el contenido de golpe, dejas que Node.js te entregue los datos en pedacitos y tú decides qué hacer con cada uno. Esa es la diferencia entre una app que escala y una que se cae con el primer archivo pesado.

¿Ya tienes claro en qué proyecto vas a aplicar streams primero? Cuéntame en los comentarios qué caso de uso te interesa resolver.