Flux Node.js


Stream est une interface abstraite, et de nombreux objets dans Node implémentent cette interface. Par exemple, l'objet de requête qui lance une requête vers le serveur http est un Stream, ainsi qu'une sortie standard (sortie standard).

Node.js, Stream a quatre types de flux :

  • Readable - opération lisible.

  • Inscriptible - Opération inscriptible.

  • Duplex - l'opération est en lecture et en écriture

  • Transformer - l'opération consiste à écrire des données. puis lisez les résultats.

Tous les objets Stream sont des instances de EventEmitter. Les événements couramment utilisés sont :

  • data - déclenchés lorsque les données sont lisibles.

  • fin - déclenché lorsqu'il n'y a plus de données à lire.

  • erreur - déclenché lorsqu'une erreur se produit lors de la réception et de l'écriture.

  • finish - déclenché lorsque toutes les données ont été écrites sur le système sous-jacent.

Ce tutoriel vous présentera les opérations de flux couramment utilisées.


Lire les données du flux

Créez le fichier input.txt avec le contenu suivant :

php中文网官网地址:www.php.cn

Créez le fichier main.js avec le code suivant :

var fs = require("fs");
var data = '';

// 创建可读流
var readerStream = fs.createReadStream('input.txt');

// 设置编码为 utf8。
readerStream.setEncoding('UTF8');

// 处理流事件 --> data, end, and error
readerStream.on('data', function(chunk) {
   data += chunk;
});

readerStream.on('end',function(){
   console.log(data);
});

readerStream.on('error', function(err){
   console.log(err.stack);
});

console.log("程序执行完毕");

Le résultat de l'exécution du code ci-dessus est le suivant :

程序执行完毕
php中文网官网地址:www.php.cn

Writing stream

Créez le fichier main.js, le code est le suivant :

var fs = require("fs");
var data = 'php中文网官网地址:www.php.cn';

// 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt');

// 使用 utf8 编码写入数据
writerStream.write(data,'UTF8');

// 标记文件末尾
writerStream.end();

// 处理流事件 --> data, end, and error
writerStream.on('finish', function() {
    console.log("写入完成。");
});

writerStream.on('error', function(err){
   console.log(err.stack);
});

console.log("程序执行完毕");

Le programme ci-dessus utilisera la variable data. Les données sont écrites dans le fichier output.txt. Le résultat de l'exécution du code est le suivant :

$ node main.js 
程序执行完毕
写入完成。

Afficher le contenu du fichier output.txt :

$ cat output.txt 
php中文网官网地址:www.php.cn

Pipe flow

Pipeline fournit un mécanisme pour le flux de sortie vers le flux d'entrée . Habituellement, nous l'utilisons pour obtenir des données d'un flux et transmettre les données à un autre flux.


250.png

Comme le montre l'image ci-dessus, nous comparons le fichier à un seau rempli d'eau, et l'eau est le contenu du fichier. Nous utilisons un tuyau pour le connecter. Les deux seaux permettent à l'eau de s'écouler d'un seau à l'autre, réalisant ainsi lentement le processus de copie de fichiers volumineux.

Dans l'exemple suivant, nous lisons le contenu d'un fichier et écrivons le contenu dans un autre fichier.

Définissez le contenu du fichier input.txt comme suit :

php中文网官网地址:www.php.cn
管道流操作实例

Créez le fichier main.js avec le code suivant :

var fs = require("fs");

// 创建一个可读流
var readerStream = fs.createReadStream('input.txt');

// 创建一个可写流
var writerStream = fs.createWriteStream('output.txt');

// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);

console.log("程序执行完毕");

Le résultat de l'exécution du code est le suivant :

$ node main.js 
程序执行完毕

Afficher le contenu du fichier output.txt :

$ cat output.txt 
php中文网官网地址:www.php.cn
管道流操作实例

Flux chaîné

Le chaînage est un mécanisme qui connecte un flux de sortie à un autre flux et crée plusieurs chaînes de opérations sur chaque flux. Les flux chaînés sont généralement utilisés pour les opérations de pipeline.

Ensuite, nous utiliserons des tuyaux et des chaînes pour compresser et décompresser des fichiers.

Créez le fichier compress.js, le code est le suivant :

var fs = require("fs");
var zlib = require('zlib');

// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('input.txt')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('input.txt.gz'));
  
console.log("文件压缩完成。");

Le résultat de l'exécution du code est le suivant :

$ node compress.js 
文件压缩完成。

Après avoir exécuté l'opération ci-dessus, nous pouvons voir que l'entrée est générée dans le répertoire courant Le fichier compressé .txt input.txt.gz.

Ensuite, décompressons le fichier et créons le fichier decompress.js avec le code suivant :

var fs = require("fs");
var zlib = require('zlib');

// 解压 input.txt.gz 文件为 input.txt
fs.createReadStream('input.txt.gz')
  .pipe(zlib.createGunzip())
  .pipe(fs.createWriteStream('input.txt'));
  
console.log("文件解压完成。");

Le résultat de l'exécution du code est le suivant :

$ node decompress.js 
文件解压完成。