Node.js ストリーム


Stream は抽象インターフェイスであり、Node 内の多くのオブジェクトがこのインターフェイスを実装しています。たとえば、http サーバーへのリクエストを開始するリクエスト オブジェクトは、ストリームと stdout (標準出力) です。

Node.js、ストリームには 4 つのストリーム タイプがあります:

  • Readable - 読み取り可能な操作。

  • Writable - 書き込み可能な操作。

  • Duplex - 読み取りおよび書き込み操作

  • Transform - 操作はデータを書き込み、結果を読み取ります。

すべての Stream オブジェクトは EventEmitter のインスタンスです。一般的に使用されるイベントは次のとおりです:

  • data - 読み取るデータがあるときにトリガーされます。

  • end - 読み取るデータがなくなったときにトリガーされます。

  • error - 受信中および書き込み中にエラーが発生したときにトリガーされます。

  • finish - すべてのデータが基礎となるシステムに書き込まれたときにトリガーされます。

このチュートリアルでは、一般的に使用されるストリーム操作を紹介します。


ストリームからデータを読み取ります

次の内容でinput.txtファイルを作成します:

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

次のコードでmain.jsファイルを作成します:

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("程序执行完毕");

上記のコードの実行結果は次のとおりです:

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

ストリームに書き込みます

次のコードで main.js ファイルを作成します:

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("程序执行完毕");

上記のプログラムは、data 変数のデータを Output.txt ファイルに書き込みます。コードの実行結果は次のとおりです:

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

output.txt ファイルの内容を表示します:

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

パイプ フロー

パイプラインは、入力ストリームへの出力フローのメカニズムを提供します。通常、これを使用して、あるストリームからデータを取得し、そのデータを別のストリームに渡します。


250.png

上の写真に示すように、ファイルを水の入ったバケツに例えます。水はファイルの内容です。水が 1 つのバケツから 2 つのバケツに流れるように、パイプを使用して 2 つのバケツを接続します。もう 1 つはバケットであり、大きなファイルのコピー プロセスをゆっくりと実現します。

次の例では、ファイルの内容を読み取り、その内容を別のファイルに書き込みます。

input.txt ファイルの内容を次のように設定します。

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

main.js ファイルを作成します。コードは次のとおりです。

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("程序执行完毕");

コードの実行結果は次のとおりです。

$ node main.js 
程序执行完毕

出力の内容を表示する.txt ファイル:

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

チェーン フロー

チェーンとは、出力ストリームを別のストリームに接続し、各ストリームで複数の操作チェーンを作成するためのメカニズムです。チェーン フローは通常、パイプライン操作に使用されます。

次に、パイプとチェーンを使用してファイルを圧縮および解凍します。

compress.js ファイルを作成します。コードは次のとおりです。

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("文件压缩完成。");

コードの実行結果は次のとおりです。

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

上記の操作を実行すると、入力の圧縮ファイル input.txt.gz が作成されたことがわかります。 txt がカレントディレクトリに生成されます。

次に、ファイルを解凍して decompress.js ファイルを作成します。コードは次のとおりです。

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("文件解压完成。");

コードの実行結果は次のとおりです。