ノード js ストリームのチュートリアル: ファイルストリーム、パイプ
Node.jsのファイルストリーム
ノードはデータ転送メカニズムとしてストリームを広範囲に利用します。
たとえば、console.log 関数を使用して何かをコンソールに出力する場合、実際にはストリームを使用してデータをコンソールに送信していることになります。
Node.js には、ファイルからデータをストリーミングして、ファイルを適切に読み書きできるようにする機能もあります。 ここでは、ストリームを使用してファイルの読み取りと書き込みを行う方法の例を見ていきます。 この例では、以下の手順に従う必要があります。
ステップ1) 以下のデータを含む data.txt というファイルを作成します。 このファイルがローカル マシンの D ドライブに保存されていると仮定します。
Node.js のチュートリアル
概要
イベント
データ接続
ジャスミンの使用
ステップ2) ストリームを利用してファイルからデータを読み取る関連コードを作成します。
var fs = require("fs"); var stream; stream = fs.createReadStream("D://data.txt"); stream.on("data", function(data) { var chunk = data.toString(); console.log(chunk); });
コードの説明:-
- まず、ストリームの作成に必要なすべての機能を含む「fs」モジュールを含める必要があります。
- 次に、createReadStream メソッドを使用して読み取り可能なストリームを作成します。入力として、data.txt ファイルの場所を指定します。
- steam.on 関数はイベント ハンドラーであり、その中で最初のパラメーターを「data」として指定しています。 これは、データがファイルからストリームに入るたびに、コールバック関数を実行することを意味します。 この例では、2 つの基本的なステップを実行するコールバック関数を定義しています。 XNUMX つ目は、ファイルから読み取ったデータを文字列として変換することです。 XNUMX つ目は、変換された文字列を出力としてコンソールに送信することです。
- データ ストリームから読み取られたデータの各チャンクを取得して文字列に変換します。
- 最後に、各文字列変換チャンクの出力をコンソールに送信します。
出力:
- コードが適切に実行されると、コンソールに上記の出力が表示されます。 この出力は、data.txt ファイル内の出力と同じになります。
ファイルへの書き込み
読み取りストリームを作成するのと同じ方法で、ファイルにデータを書き込むための書き込みストリームを作成することもできます。 まず、data.txt という中身のない空のファイルを作成しましょう。 このファイルがコンピューターの D ドライブに配置されていると仮定します。
以下のコードは、ファイルにデータを書き込む方法を示しています。
var fs = require("fs"); var stream; stream = fs.createWriteStream("D://data.txt"); stream.write("Tutorial on Node.js") stream.write("Introduction") stream.write("Events") stream.write("Generators") stream.write("Data Connectivity") stream.write("Using Jasmine")
コードの説明:-
- createWriteStream メソッドを使用して書き込み可能なストリームを作成しています。 入力として、data.txt ファイルの場所を指定します。
- 次に、stream.write メソッドを使用して、テキストのさまざまな行をテキスト ファイルに書き込みました。 ストリームは、このデータを data.txt ファイルに書き込みます。
data.txtファイルを開くと、ファイル内に次のデータが表示されます。
Node.js のチュートリアル
概要
イベント
Generators
データ接続
使い方 ジャスミン
Node.jsのパイプ
Node アプリケーション内では、次の XNUMX つの引数を取る Pipe() メソッドを使用してストリームをパイプ接続できます。
- データの宛先として機能する必須の書き込み可能なストリーム。
- オプションを渡すために使用されるオプションのオブジェクト。
あるファイルから別のファイルにデータを転送する場合のパイプの使用の典型的な例です。
それでは、パイプを使用してあるファイルから別のファイルにデータを転送する方法の例を見てみましょう。
ステップ1) 以下のデータを含む datainput.txt というファイルを作成します。 このファイルがローカル マシンの D ドライブに保存されていると仮定します。
Node.js のチュートリアル
概要
イベント
Generators
データ接続
ジャスミンの使用
ステップ2) dataOutput.txt という名前の空のファイルを作成し、ローカル マシンの D ドライブに配置します。
ステップ3) 以下のコードを記述して、datainput.txt ファイルから dataOutput.txt ファイルへのデータの転送を実行します。
var fs = require("fs"); var readStream = fs.createReadStream("D://datainput.txt"); var writeStream = fs.createWriteStream("D://dataOutput.txt"); readStream.pipe(writeStream);
コードの説明:-
- まず、新しいファイルに転送する必要があるすべてのデータを含む datainput.txt ファイルへの「readstream」を作成します。
- 次に、dataOutput.txt ファイルへの「書き込みストリーム」を作成する必要があります。これは空のファイルであり、datainput.txt ファイルからのデータの転送先です。
- 次に、パイプ コマンドを使用して、読み取りストリームから書き込みストリームにデータを転送します。 パイプ コマンドは、読み取りストリームに入るすべてのデータを取得し、それを書き込みストリームにプッシュします。
dataOutput.txt ファイルを開くと、datainput.txt ファイルに存在していたすべてのデータが表示されます。
Node.js のイベント
イベントは Node.js の重要な概念の 1 つであり、Node.js はイベント駆動型フレームワークと呼ばれることもあります。
基本的に、イベントとは何かが起こることです。 たとえば、データベースへの接続が確立されると、データベース接続イベントがトリガーされます。 イベント駆動型プログラミングとは、特定のイベントがトリガーされたときにトリガーされる関数を作成することです。
Node.js でイベントを定義する基本的な例を見てみましょう。
「data_received」というイベントを作成します。 このイベントがトリガーされると、「データを受信しました」というテキストがコンソールに送信されます。
var events = require('events'); var eventEmitter = new events.EventEmitter(); eventEmitter.on('data_received', function() { console.log('data received succesfully.'); }); eventEmitter.emit('data_received');
コードの説明:-
- require 関数を使用して「events」モジュールを含めます。 このモジュールを使用すると、Node.js でイベントを作成できるようになります。
- 新しいイベント エミッターを作成します。 これは、イベント (この場合は「data_received」) をステップ 3 で定義されたコールバック関数にバインドするために使用されます。
- 「data_received」イベントがトリガーされた場合に「data_received」というテキストをコンソールに出力する必要があるというイベント駆動関数を定義します。
- 最後に、eventEmiter.emit 関数を使用してイベントを手動でトリガーします。 これにより、data_received イベントがトリガーされます。
プログラムを実行すると、以下に示すように「データを受信しました」というテキストがコンソールに送信されます。
イベントの発行
イベントを定義する場合、呼び出すことができるイベントにはさまざまなメソッドがあります。 このトピックでは、それぞれを詳しく見ることに焦点を当てます。
- ワンタイムイベントハンドラ
場合によっては、イベントが初めて発生したときにのみイベントに反応することに興味があるかもしれません。 このような状況では、once() メソッドを使用できます。
イベント ハンドラーに Once メソッドをどのように利用できるかを見てみましょう。
コードの説明:-
- ここでは、「once」メソッドを使用して、イベント「data_received」に対してコールバック関数を XNUMX 回だけ実行する必要があることを示しています。
- ここでは、「data_received」イベントを手動でトリガーしています。
- 「data_received」イベントが再度トリガーされても、今度は何も起こりません。 これは、最初のステップでイベントは XNUMX 回しかトリガーできないと述べたためです。
コードが正しく実行されると、ログの出力は「data_received success」になります。 このメッセージはコンソールに XNUMX 回だけ表示されます。
- イベントリスナーの検査
イベント エミッターには、その存続期間のどの時点でも、XNUMX 個以上のリスナーをアタッチできます。 各イベント タイプのリスナーは、いくつかの方法で検査できます。
接続されているリスナーの数を確認することのみに興味がある場合は、EventEmitter.listenerCount() メソッドを参照してください。
(ご注意: リスナーが重要なのは、メイン プログラムがリスナーがイベントにオンザフライで追加されているかどうかを認識する必要があるためです。そうしないと、追加のリスナーが呼び出されるためにプログラムが誤動作します)。
コードの説明:-
- イベント関連のメソッドを使用するために必要なeventEmitterタイプを定義しています。
- 次に、イベント ハンドラーの定義に使用されるエミッターと呼ばれるオブジェクトを定義します。
- 基本的に何もしない 2 つのイベント ハンドラーを作成しています。 この例では、listenerCount メソッドがどのように機能するかを示すためだけに、これを単純にしています。
- ここで、data_received イベントでlistenerCount メソッドを呼び出すと、このイベントに関連付けられたイベント リスナーの数がコンソール ログに送信されます。
コードが正しく実行されると、コンソール ログに値 2 が表示されます。
- newListener イベント
新しいイベント ハンドラーが登録されるたびに、イベント エミッターは newListener イベントを発行します。 このイベントは、新しいイベント ハンドラーを検出するために使用されます。 通常、新しいイベント ハンドラーごとにリソースを割り当てたり、何らかのアクションを実行したりする必要がある場合は、newListener イベントを使用します。
var events = require('events'); var eventEmitter = events.EventEmitter; var emitter = new eventEmitter(); emitter.on("newListener", function(eventName, listener) { console.log("Added listener for " + eventName + " events"); }); emitter.on('data_received', function() {}); emitter.on('data_received', function() {});
コードの説明:-
- 「newListener」イベントの新しいイベント ハンドラーを作成しています。新しいイベント ハンドラーが登録されるたびに、コンソールに「リスナーが追加されました」というテキスト + イベント名が表示されます。
- ここでは、「追加リスナー」というテキストと、登録されている各イベントのイベント名をコンソールに書き込んでいます。
- イベント「data_received」に対して 2 つのイベント ハンドラーを定義しています。
上記のコードが正しく実行されると、コンソールに以下のテキストが表示されます。 これは、「newListener」イベント ハンドラーが XNUMX 回トリガーされたことを示しているだけです。
data_received イベントのリスナーを追加しました
data_received イベントのリスナーを追加しました
まとめ
- ストリームは、入出力デバイスからデータを読み書きするために Node.js で使用されます。 Node.js 'fs' ライブラリを使用して、ファイルへの読み取りおよび書き込み可能なストリームを作成します。これらのストリームは、ファイルからデータを読み書きするために使用できます。
- パイプを使用して複数のストリームを接続できます。 最も一般的な例の XNUMX つは、あるファイルから別のファイルにデータを転送するために、読み取りストリームと書き込みストリームをパイプ処理することです。
- Node.js はイベント駆動型フレームワークとしてもタグ付けされることが多く、Node.js でイベントを定義するのは非常に簡単です。 これらのイベントに応答する関数を定義できます。
- イベントは、主要なイベントに応答するためのメソッドも公開します。 たとえば、イベントがトリガーされたときにコールバック関数が XNUMX 回だけ実行されるようにするために使用できる、once() イベント ハンドラーを見てきました。