Node.js-ストリーム

ストリームとは何ですか?

ストリームは、ソースからデータを読み取ったり、宛先にデータを継続的に書き込んだりできるオブジェクトです。Node.jsには、4つのタイプのストリームがあります-

  • Readable −読み取り操作に使用されるストリーム。

  • Writable −書き込み操作に使用されるストリーム。

  • Duplex −読み取り操作と書き込み操作の両方に使用できるストリーム。

  • Transform −入力に基づいて出力が計算されるタイプのデュプレックスストリーム。

ストリームの各タイプは EventEmitterインスタンスと時間の異なるインスタンスでいくつかのイベントをスローします。たとえば、一般的に使用されるイベントのいくつかは次のとおりです。

  • data −このイベントは、読み取り可能なデータがある場合に発生します。

  • end −このイベントは、読み取るデータがなくなると発生します。

  • error −このイベントは、データの受信または書き込み中にエラーが発生した場合に発生します。

  • finish −このイベントは、すべてのデータが基盤となるシステムにフラッシュされたときに発生します。

このチュートリアルでは、Streamsで一般的に使用される操作の基本的な理解を提供します。

ストリームからの読み取り

次の内容のinput.txtという名前のテキストファイルを作成します-

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

次のコードを使用して、main.jsという名前の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');

// Handle stream events --> 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("Program Ended");

次に、main.jsを実行して結果を確認します-

$ node main.js

出力を確認します。

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

ストリームへの書き込み

次のコードを使用して、main.jsという名前のjsファイルを作成します-

var fs = require("fs");
var data = 'Simply Easy Learning';

// 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();

// Handle stream events --> finish, and error
writerStream.on('finish', function() {
   console.log("Write completed.");
});

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

console.log("Program Ended");

次に、main.jsを実行して結果を確認します-

$ node main.js

出力を確認します。

Program Ended
Write completed.

次に、現在のディレクトリに作成されたoutput.txtを開きます。次のものが含まれている必要があります-

Simply Easy Learning

ストリームの配管

配管は、あるストリームの出力を別のストリームへの入力として提供するメカニズムです。これは通常、あるストリームからデータを取得し、そのストリームの出力を別のストリームに渡すために使用されます。配管作業に制限はありません。次に、あるファイルから読み取り、別のファイルに書き込むためのパイピングの例を示します。

次のコードを使用して、main.jsという名前の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);

console.log("Program Ended");

次に、main.jsを実行して結果を確認します-

$ node main.js

出力を確認します。

Program Ended

現在のディレクトリに作成されたoutput.txtを開きます。次のものが含まれている必要があります-

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

ストリームの連鎖

チェーンは、あるストリームの出力を別のストリームに接続し、複数のストリーム操作のチェーンを作成するメカニズムです。通常、配管作業で使用されます。次に、パイピングとチェーンを使用して、最初にファイルを圧縮し、次に同じものを解凍します。

次のコードを使用して、main.jsという名前の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.");

次に、main.jsを実行して結果を確認します-

$ node main.js

出力を確認します。

File Compressed.

input.txtが圧縮され、現在のディレクトリにinput.txt.gzファイルが作成されていることがわかります。次に、次のコードを使用して同じファイルを解凍してみましょう-

var 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.");

次に、main.jsを実行して結果を確認します-

$ node main.js

出力を確認します。

File Decompressed.