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

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

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

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

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

  • Transform - 操作がデータに書き込まれ、結果が読み取られます。

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

  • data - 読み取るデータがある場合に起動します。

  • end - 読み取るデータがなくなったときに起動します。

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

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

このチュートリアルでは、一般的なストリーム操作を紹介します。

ストリームからデータを読み取る

次の内容を含む input.txt ファイルを作成します。

HTML チュートリアルのアドレス: w3cstudy.cc

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("プログラムの実行が完了しました");

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

プログラムの実行が完了しました
HTML チュートリアルのアドレス: w3cstudy.cc

ストリームの書き込み

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

var fs = require("fs");
var data = 'HTML チュートリアルのアドレス: w3cstudy.cc';

// ファイルoutput.txtに書き込むことができるストリームを作成します
var writerStream = fs.createWriteStream('output.txt');

// utf8 エンコーディングを使用してデータを書き込みます
writerStream.write(data,'UTF8');

// ファイルの終わりをマークする
writerStream.end();

// 处理流事件 --> finish、error
writerStream.on('finish', function() {
    console.log("書き込みが完了しました。");
});

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

console.log("プログラムの実行が完了しました");

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

$ node main.js 
プログラムの実行が完了しました
書き込みが完了しました。

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

$ cat output.txt 
HTML チュートリアルのアドレス: w3cstudy.cc

パイプライン フロー

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

上の図のように、ファイルを水の入ったバケツに例えると、水がファイルの中身であり、パイプ(パイプ)を使って2つのバケツを接続し、一方のバケツからもう一方のバケツに水が流れるようにします。 , そのため、大きなファイルのコピープロセスをゆっくりと実現します。

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

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

HTML チュートリアルのアドレス: w3cstudy.cc
パイプラインフローの動作例

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 
プログラムの実行が完了しました

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

$ cat output.txt 
HTML チュートリアルのアドレス: w3cstudy.cc
パイプラインフローの動作例

チェーンフロー

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

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

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の圧縮ファイルinput.txt.gzが生成されていることがわかります。

次に、ファイルを解凍し、次のコードを含む 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("ファイルの解凍が完了しました。");

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

$ node decompress.js 
ファイルの解凍が完了しました。