¿Qué es una corriente?
En Node.js, Stream es una interfaz abstracta para procesar datos. Proporciona una forma eficiente de leer o escribir grandes cantidades de datos sin cargar todos los datos en la memoria a la vez.
Un flujo se puede ver como una secuencia ordenada de fragmentos de datos que se pueden transmitir uno tras otro sin esperar a que todos los datos estén listos. Los flujos pueden leer datos de una ubicación y transferirlos a otra ubicación para su procesamiento, lo que permite que los datos lleguen de forma incremental durante el procesamiento sin esperar a que todos los datos estén completamente cargados.
Los flujos en Node.js se pueden dividir en flujos legibles (Readable), flujos grabables (Writable), flujos legibles y grabables (Duplex) y flujos de transformación (Transform). Cada tipo de flujo tiene diferentes características y escenarios de uso.
Flujo legible (legible)
Una secuencia legible es una secuencia que lee datos de una fuente. Las fuentes pueden ser archivos, conexiones de red u otras fuentes de datos. Los flujos legibles proporcionan un mecanismo para obtener datos gradualmente y pueden leer datos en lotes según las necesidades reales.
Crear una transmisión legible
En Node.js, podemos leer datos creando un objeto de flujo legible. Aquí hay un ejemplo que muestra cómo crear una transmisión legible:
const fs = require('fs');
const readableStream = fs.createReadStream('file.txt');
El código anterior crea una secuencia legible que file.txt
lee datos del archivo nombrado.
leer datos
Para leer datos de un flujo legible, puede data
hacerlo escuchando eventos. Se activará un evento cuando haya un nuevo bloque de datos disponible data
, pasando el bloque de datos como argumento.
Aquí hay un ejemplo que muestra cómo leer datos de un flujo legible:
readableStream.on('data', (chunk) => {
console.log('接收到数据块:', chunk);
});
En el ejemplo anterior, cada vez que el flujo legible recibe una nueva porción de datos, imprimimos el contenido de esa porción.
evento final
Los flujos legibles también desencadenan end
eventos para indicar que se han leído todos los datos. Podemos end
realizar algunas operaciones de limpieza en el detector de eventos o continuar con el siguiente paso.
Aquí hay un ejemplo que muestra cómo escuchar end
eventos en una transmisión legible:
readableStream.on('end', () => {
console.log('数据读取完毕');
});
En el ejemplo anterior, cuando el flujo legible haya leído todos los datos, end
se activará un evento y se imprimirá la información correspondiente.
Flujo grabable (Escribible)
Una secuencia grabable es una secuencia que escribe datos en una ubicación de destino. La ubicación de destino puede ser un archivo, una conexión de red u otra ubicación de almacenamiento de datos. Los flujos grabables proporcionan un mecanismo para escribir datos de forma incremental, fragmento por fragmento, según sea necesario.
Crear flujo de escritura
En Node.js, podemos escribir datos en una ubicación de destino mediante la creación de un objeto de flujo de escritura. Aquí hay un ejemplo que muestra cómo crear una secuencia de escritura:
const fs = require('fs');
const writableStream = fs.createWriteStream('output.txt');
El código anterior crea un flujo de escritura que escribe datos en output.txt
el archivo nombrado.
Entrada de datos
Para escribir datos en un flujo grabable, use write
el método. write
El método acepta un fragmento de datos como argumento y lo escribe en la secuencia.
Aquí hay un ejemplo que muestra cómo escribir datos en un flujo de escritura:
writableStream.write('Hello, world!');
En el ejemplo anterior, escribimos un fragmento de datos de texto en el flujo de escritura.
secuencia final
Una vez que todos los datos se han escrito en el flujo de escritura, end
se debe llamar a un método para finalizar el flujo. Una vez finalizada la transmisión, no se aceptarán nuevos fragmentos.
Aquí hay un ejemplo que muestra cómo finalizar una transmisión grabable:
writableStream.end();
En el ejemplo anterior, llamamos end
al método para finalizar el flujo de escritura.
Secuencias legibles y grabables (dúplex)
Una secuencia de lectura y escritura es una secuencia que puede leer y escribir datos. Implementa flujos de lectura y escritura. Los flujos de lectura y escritura son muy útiles en algunos escenarios, como las conexiones de red.
Crear una transmisión legible y escribible
En Node.js, podemos lograr un flujo bidireccional de lectura y escritura de datos mediante la creación de un objeto de flujo de lectura y escritura. Aquí hay un ejemplo que muestra cómo crear una secuencia legible y escribible:
const net = require('net');
const duplexStream = new net.Socket();
El código anterior crea un objeto de flujo legible y escribible, y usa net
el módulo para crear un socket TCP (Socket).
leer y escribir datos
Un flujo de lectura y escritura puede leer y escribir datos. Podemos data
leer los datos del flujo de lectura y escritura escuchando el evento y write
escribir datos en el flujo de lectura y escritura llamando al método.
Aquí hay un ejemplo que muestra cómo leer y escribir datos en un flujo legible y escribible:
duplexStream.on('data', (chunk) => {
console.log('接收到数据:', chunk);
});
duplexStream.write('Hello, world!');
En el ejemplo anterior, escuchamos los eventos del flujo de lectura y escritura data
, y cuando hay un nuevo bloque de datos disponible, imprimimos el contenido del bloque de datos. Luego, write
escribimos un dato en el flujo de lectura y escritura a través del método.
Flujo de transformación (Transformar)
Un flujo de conversión es un flujo especial de lectura y escritura que convierte los datos de entrada antes de enviarlos. Los flujos de transformación son muy útiles en el desarrollo real, como comprimir, cifrar o analizar datos.
Crear un flujo de transformación
En Node.js, podemos implementar la conversión de datos creando un objeto de flujo de conversión. Aquí hay un ejemplo que muestra cómo crear una secuencia de transformación:
const {
Transform } = require('stream');
const myTransform = new Transform({
transform(chunk, encoding, callback) {
// 在这里处理数据转换逻辑
const transformedData = chunk.toString().toUpperCase();
this.push(transformedData);
callback();
}
});
El código anterior crea un objeto de flujo de conversión myTransform
y transform
define la lógica de conversión de datos a través de métodos. En este ejemplo, convertimos el fragmento de entrada a mayúsculas y push
empujamos el fragmento convertido al lado legible a través de un método.
usar flujo de transición
Para transformar datos utilizando un flujo de transformación, insértelo entre los flujos de datos de entrada y salida. A medida que los datos pasan por el flujo de transformación, se procesarán transform
de acuerdo con la lógica de transformación que definimos en el método.
Aquí hay un ejemplo que muestra cómo usar flujos de transformación para la transformación de datos:
const fs = require('fs');
const readableStream = fs.createReadStream('input.txt');
const writableStream = fs.createWriteStream('output.txt');
readableStream.pipe(myTransform).pipe(writableStream);
En el ejemplo anterior, creamos un flujo de lectura y un flujo de escritura. Luego, use pipe
el método para insertar el flujo de conversión myTransform
entre el flujo de lectura y el flujo de escritura para realizar la conversión y salida de datos.
en conclusión
Los flujos en Node.js brindan una forma eficiente de procesar grandes cantidades de datos. Los flujos legibles, los flujos grabables, los flujos legibles y grabables y los flujos de conversión tienen diferentes características y usos, y el tipo de flujo apropiado se puede seleccionar de acuerdo con las necesidades reales.
Este artículo presenta en detalle el concepto, la creación y el uso de secuencias en Node.js y proporciona los códigos de muestra correspondientes. Espero que a través de este artículo, tenga una comprensión más profunda del flujo en Node.js y pueda usar de manera flexible la capacidad del flujo para procesar datos en el desarrollo real.