Un flujo es una forma de manejo de datos que nos ayuda a obtener una salida secuencial al leer o escribir la entrada (archivos, comunicaciones de red y cualquier tipo de intercambio de información de extremo a extremo). Es decir, te permiten leer datos de un origen o escribirlos en un destino o realizar cualquier otra tarea específica de forma ininterrumpida y constante. La transmisión no es un concepto exclusivo de Node.js y es parte de Unix desde hace bastante tiempo. Se utiliza un operador de tubería para hacer que los programas reaccionen entre sí pasando flujos. Por lo tanto, la transmisión de Node.js se usa como base para todas las API de transmisión.
Ejemplo: cuando está transmitiendo YouTube, Netflix, Spotify, en lugar de descargar todo el contenido a la vez, se descarga en pequeños fragmentos mientras sigue navegando. Otro ejemplo puede ser chatear en Facebook o WhatsApp, donde los datos fluyen continuamente entre dos personas.
Esto se debe a que, en lugar de leer todos los datos a la vez en la memoria, la secuencia los procesa en partes más pequeñas para que los archivos grandes sean fáciles de leer. Es útil porque algunos archivos son más grandes que el espacio libre disponible que tiene en su dispositivo. Por lo tanto, la secuencia hace que dichos archivos sean legibles.
Ventajas de la corriente:
- Eficiencia de la memoria: Stream es eficiente en la memoria (espacial) porque le permite descargar archivos en fragmentos más pequeños en lugar de un todo en la memoria antes de que pueda procesarlos, ahorrando así espacio.
- Eficiencia del tiempo: Stream es eficiente en el tiempo porque comienza a procesar los datos en partes más pequeñas, por lo que el procedimiento comienza antes en comparación con la forma general, donde debe descargar todos los datos para poder procesarlos. Por lo tanto, este procesamiento temprano ahorra mucho tiempo.
- Datos componibles: los datos se componen debido a la capacidad de canalización de los flujos que les permite conectarse entre sí a pesar de lo pesados que sean los códigos. Significa que el proceso de canalización de una entrada a la salida continúa ocurriendo.
Tipos de corriente:
- Flujo legible: Es el flujo desde donde se pueden recibir y leer los datos de forma ordenada. Sin embargo, no se le permite enviar nada. Por ejemplo, fs.createReadStream() nos permite leer el contenido de un archivo.
- Flujo de escritura: es el flujo donde puede enviar datos de manera ordenada pero no puede recibirlos de vuelta. Por ejemplo, fs.createWriteStream() nos permite escribir datos en un archivo.
- Flujo dúplex: es el flujo que se puede leer y escribir. Por lo tanto, puede enviar y recibir datos juntos. Por ejemplo net.Socket es un socket TCP.
- Flujo de transformación: es el flujo que se utiliza para modificar los datos o transformarlos a medida que se leen. El flujo de transformación es básicamente de naturaleza dúplex. Por ejemplo, el flujo zlib.createGzip se usa para comprimir los datos usando gzip.
Las diferentes operaciones en una secuencia son:
- Lectura de un flujo: Cree un archivo llamado input.txt con el siguiente texto:
Este es un código para obtener información sobre la lectura de un flujo.Nombre de archivo: principal.js
var
fs = require(
"fs"
);
var
data =
''
;
// Create a readable stream
var
readerStream = fs.createReadStream(
"input.txt"
);
// Set the encoding to be utf8.
readerStream.setEncoding(
"UTF8"
);
// Handling data stream event
readerStream.on(
"data"
,
function
(chunk) {
data += chunk;
});
// Handling end stream event
readerStream.on(
"end"
,
function
() {
console.log(data);
});
// Handling error stream event
readerStream.on(
"error"
,
function
(err) {
console.log(err.stack);
});
Ejecute el archivo main.js con el siguiente comando:
$node main.js
La salida del comando anterior se muestra a continuación:
This is a code to learn about the reading from a stream.
- Escribir en una secuencia
Nombre de archivo: principal.js
var
fs = require(
'fs'
);
var
data =
'This is a code to learn"
+ " about writing in a stream.'
;
// Create a writable stream
var
writerStream =
fs.createWriteStream(
'output.txt'
);
// Write the data to stream with
// encoding to be utf8
writerStream.write(data,
'UTF8'
);
// Mark the end of file
writerStream.end();
// Handling finish stream event
writerStream.on(
'finish'
,
function
() {
});
// Handling error stream event
writerStream.on(
'error'
,
function
(err) {
console.log(err.stack);
});
Ejecute el archivo main.js con el siguiente comando:
$node main.js
Después de ejecutar el comando anterior, se creará un archivo llamado salida.txt en el directorio actual con el siguiente texto:
This is a code to learn about writing in a stream.
- Canalización de la secuencia: la canalización es una operación o un mecanismo en el que proporcionamos la salida de una secuencia (legible, es decir, el archivo de origen) de datos como entrada a otra secuencia (escribible, es decir, el archivo de destino). Normalmente se usa para obtener datos de un flujo (es decir, leer desde la fuente) y pasar la salida de ese flujo a otro flujo (es decir, escribir en el destino) sin administrar el flujo usted mismo. Es la forma más fácil de consumir streams. No hay límite en las operaciones de tubería. Se utiliza para procesar datos transmitidos de múltiples maneras. Por ejemplo, leer de un archivo y escribirlo en otro.
Cree un archivo llamado input.txt con el siguiente texto:
This is a code to learn about piping the stream.
Nombre de archivo: principal.js
var
fs = require(
'fs'
);
// Create a readable stream
var
readerStream = fs.createReadStream(
'input.txt'
);
// Create a writable stream
var
writerStream = fs.createWriteStream(
'output.txt'
);
// Pipe the read and write operations
// read input.txt and write data to output.txt
readerStream.pipe(writerStream);
Ejecute el archivo main.js con el siguiente comando:
$node main.js
Después de ejecutar el comando anterior, se creará un archivo llamado output.txt en el directorio actual con el siguiente texto:
This is a code to learn about piping the stream.
- Enstringmiento de la transmisión: El enstringmiento de la transmisión es un mecanismo para crear una string de múltiples operaciones de transmisión al conectar la salida de una transmisión con otra transmisión. Normalmente se utiliza con operaciones de tuberías. Por ejemplo, usaremos tuberías y enstringmientos para comprimir primero un archivo y luego descomprimirlo.
Nombre de archivo: principal.js
var
fs = require(
'fs'
);
var
zlib = require(
'zlib'
);
// Compress the file input.txt to input.txt.gz
fs.createReadStream(
'input.txt'
)
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream(
'input.txt.gz'
));
console.log(
'File Compressed.'
);
Ejecute el archivo main.js con el siguiente comando:
$node main.js
La salida del comando anterior se muestra a continuación:
File Compressed.
Encontrará que input.txt ha sido comprimido y creó un archivo input.txt.gz en el directorio actual.
Ahora, el código para descomprimir el archivo creado anteriormente se muestra a continuación:
Nombre de archivo: main.jsvar
fs = require(
'fs'
);
var
zlib = require(
'zlib'
);
// Decompress the file input.txt.gz to input.txt
fs.createReadStream(
'input.txt.gz'
)
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream(
'input.txt'
));
console.log(
'File Decompressed.'
);
Ejecute el archivo main.js con el siguiente comando:
$node main.js
La salida del comando anterior se muestra a continuación:
File Decompressed.
Encontrará que input.txt.gz ha sido descomprimido.
Publicación traducida automáticamente
Artículo escrito por ankita54ap y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA