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 ファイルの解凍が完了しました。