【ノード.js】Streamの学習ノート
6355 ワード
最近勉強しています.jsはhttp proxy serverを作成し、Streamと付き合う必要があります.昨日からいくつかの資料を調べ始めたが,多少の粗浅な理解があった.ここに整理して、勉強のために使います.
ノードからjs APIドキュメントでは、
"A stream is an abstract interface implemented by various objects in Node. For example a request to an HTTP server is a stream, as is stdout . Streams are readable, writable, or both. All streams are instances of EventEmitter."「ストリームは多くのI/0操作の抽象であり、ノード内の多くのオブジェクトによって実現される.例えば、1つのHTTPサーバに対する要求はストリーム(読み取り可能なストリーム)(サーバの応答はストリーム(書き込み可能なストリーム))、stdoutもストリームである.ストリームは読み取り可能、書き込み可能、または両方を兼ね備えている.ストリームはEventEmitterのインスタンスである」
一.ストリーム(Stream)が必要なのはなぜですか?
たとえば、ファイルを読み込む場合は、一度に読み込むのに大きなメモリが必要になるため、望ましくありません.そのため、ストリームがあり、ストリームを使用するのが便利で、このような問題を回避することができます.インタフェースを呼び出すには、下位層がどのように実現されるかに関心を持つ必要はありません.
二.ストリーム(Stream)とは?
ストリーム(Stream)は読み取り可能、書き込み可能、またはデュプレクスです.ストリームのベースクラスは、Readableストリーム、Writableストリーム、Duplexストリーム、Transformストリームの4種類のベースクラスを含むrequire('stream')によってロードできます.
また,上記4種類のベースクラスストリームが需要を満たすことができないと感じたら,独自の拡張クラスストリームを記述することができる.私たちのチームが今やっているノードプロジェクトのように、Transformクラスを書き換えて使用しています.
公式のAPIドキュメントに従って、次の手順に従います.適切な親を子クラスに拡張します.(例えばutil.inherits(MyTransform,Transform); ) 構造関数で親クラスの構造関数を呼び出し、内部のメカニズムが正しく初期化されていることを確認します. は、以下の詳細を参照して、1つまたは複数の特定の方法を実装する.
三.Readableストリーム(読み取り可能なストリーム)の説明
Readable(読み取り可能)ストリームインタフェースは、読み込んでいるデータのソースの抽象です.すなわち、データは読み取り可能なストリームから出ている.
Readableストリームには、フローモードと一時停止モードの2つのモードがあります.
フローモードにある場合、データは最下位システムから読み出され、できるだけ早くプログラムに提供されます.一時停止モードの場合は、
A.次の3つの方法により、可読ストリームがフローモードに切り替わる
1.データを傍受する'data'イベントプロセッサを追加します.
2.resume()メソッドを呼び出して、データストリームを明確に開きます.
3. pipe()メソッドを呼び出して、書き込み可能なストリーム(Writable)にデータを送信します.
これまでpipe()の使い方に疑問を持っていましたが、使い方が分かりません.次に、pipe()を使用して読み取り可能なストリームに受信者(書き込み可能なストリーム)を指定すると、データは本当に下位システムから読み出され、書き込み可能なストリームに渡されることが分かった.
B.Readableストリームには以下のようなイベントがあります.
1. 'Readableイベント
2. 'Data'イベント-データが渡されている間にイベントがトリガーされます(chunkデータブロックをオブジェクトとします)
3. 'end'イベント-データ転送が完了すると、イベントがトリガーされます.
4. 'closeイベント
5. 'errorイベント
これらのイベントはすべて、公式APIドキュメントで例を見つけることができます.
C.次にReadableストリームの重要な方法,pipe()方法を紹介する.
この方法は、読み取り可能なストリームからすべてのデータを引き出し、提供されたターゲット(書き込み可能なストリーム)に書き込む.この方法は、ターゲットが高速読み取り可能な読み取り可能なストリームに埋もれないように、トラフィックを自動的に制御することができる.
デフォルトでは、データ転送が完了し、「end」イベントがトリガーされると、ターゲット(書き込み可能なストリーム)の「end」イベントが同時にトリガーされ、ターゲットが書き込み不可能になることに注意してください.
簡単な例を挙げると
data.txtファイルの内容は以下の通りです.
このコードが実行されると、ユーザはhttp://127.0.0.1:3000/にアクセスし、次のような応答を得る.
このとき、このサーバを作成すると、streamが呼び出されると、ユーザアクセス要求が来る.pipe(res)読み取り可能ストリームにターゲットを指定すると、読み取り可能ストリームstreamはファイルdataから開始する.txtでデータを読み出し、res(書き込み可能なストリーム)にデータを書き込むと、resのend()メソッドが自動的に呼び出され、応答が終了し、書き込み可能なストリームは書き込まれなくなります.
四.Writableストリーム(書き込み可能ストリーム)の紹介
Writable(書き込み可能)ストリームインタフェースは、データを書き込むターゲットの抽象である.
書き込み可能なストリームの重要な2つの方法
1. write()メソッド
この方法は、下位システムにデータを書き込み、データが処理された後に、与えられたコールバックを呼び出す.
2. end()メソッド
データが書き込まれなくなった場合、このメソッドを呼び出し、書き込みを停止します.end()を呼び出した後、write()メソッドを呼び出すとエラーが発生します.
五.参考資料
1. Node.js公式APIドキュメント
http://www.nodejs.org/api/stream.html
2. 公式APIドキュメント中国語版
http://nodeapi.ucdok.com/#/api/stream.html
3.ノード内のストリーム(Stream)
http://blog.segmentfault.com/xingrz/1190000000357044
4. Node Streams: How do they work?
http://maxogden.com/node-streams.html
れんがを投げて玉を引いて、給油を続けます.
Best Regards
Kevin Song
- 2014/6/18
ノードからjs APIドキュメントでは、
"A stream is an abstract interface implemented by various objects in Node. For example a request to an HTTP server is a stream, as is stdout . Streams are readable, writable, or both. All streams are instances of EventEmitter."「ストリームは多くのI/0操作の抽象であり、ノード内の多くのオブジェクトによって実現される.例えば、1つのHTTPサーバに対する要求はストリーム(読み取り可能なストリーム)(サーバの応答はストリーム(書き込み可能なストリーム))、stdoutもストリームである.ストリームは読み取り可能、書き込み可能、または両方を兼ね備えている.ストリームはEventEmitterのインスタンスである」
一.ストリーム(Stream)が必要なのはなぜですか?
たとえば、ファイルを読み込む場合は、一度に読み込むのに大きなメモリが必要になるため、望ましくありません.そのため、ストリームがあり、ストリームを使用するのが便利で、このような問題を回避することができます.インタフェースを呼び出すには、下位層がどのように実現されるかに関心を持つ必要はありません.
二.ストリーム(Stream)とは?
ストリーム(Stream)は読み取り可能、書き込み可能、またはデュプレクスです.ストリームのベースクラスは、Readableストリーム、Writableストリーム、Duplexストリーム、Transformストリームの4種類のベースクラスを含むrequire('stream')によってロードできます.
また,上記4種類のベースクラスストリームが需要を満たすことができないと感じたら,独自の拡張クラスストリームを記述することができる.私たちのチームが今やっているノードプロジェクトのように、Transformクラスを書き換えて使用しています.
公式のAPIドキュメントに従って、次の手順に従います.
三.Readableストリーム(読み取り可能なストリーム)の説明
Readable(読み取り可能)ストリームインタフェースは、読み込んでいるデータのソースの抽象です.すなわち、データは読み取り可能なストリームから出ている.
Readableストリームには、フローモードと一時停止モードの2つのモードがあります.
フローモードにある場合、データは最下位システムから読み出され、できるだけ早くプログラムに提供されます.一時停止モードの場合は、
stream.read()
を明確に呼び出して、いくつかのデータブロックを取り出す必要があります.ストリームはデフォルトで一時停止モードです.A.次の3つの方法により、可読ストリームがフローモードに切り替わる
1.データを傍受する'data'イベントプロセッサを追加します.
2.resume()メソッドを呼び出して、データストリームを明確に開きます.
3. pipe()メソッドを呼び出して、書き込み可能なストリーム(Writable)にデータを送信します.
これまでpipe()の使い方に疑問を持っていましたが、使い方が分かりません.次に、pipe()を使用して読み取り可能なストリームに受信者(書き込み可能なストリーム)を指定すると、データは本当に下位システムから読み出され、書き込み可能なストリームに渡されることが分かった.
B.Readableストリームには以下のようなイベントがあります.
1. 'Readableイベント
2. 'Data'イベント-データが渡されている間にイベントがトリガーされます(chunkデータブロックをオブジェクトとします)
3. 'end'イベント-データ転送が完了すると、イベントがトリガーされます.
4. 'closeイベント
5. 'errorイベント
これらのイベントはすべて、公式APIドキュメントで例を見つけることができます.
C.次にReadableストリームの重要な方法,pipe()方法を紹介する.
この方法は、読み取り可能なストリームからすべてのデータを引き出し、提供されたターゲット(書き込み可能なストリーム)に書き込む.この方法は、ターゲットが高速読み取り可能な読み取り可能なストリームに埋もれないように、トラフィックを自動的に制御することができる.
デフォルトでは、データ転送が完了し、「end」イベントがトリガーされると、ターゲット(書き込み可能なストリーム)の「end」イベントが同時にトリガーされ、ターゲットが書き込み不可能になることに注意してください.
簡単な例を挙げると
1 //http.js
2
3 var http = require('http');
4 var fs = require('fs');
5
6 http.createServer(function(req, res){
7 var stream = fs.createReadStream(__dirname + '/data.txt');
8 stream.pipe(res);
9 }).listen(3000);
10
11 console.log('now we are listening 3000 port');
data.txtファイルの内容は以下の通りです.
このコードが実行されると、ユーザはhttp://127.0.0.1:3000/にアクセスし、次のような応答を得る.
このとき、このサーバを作成すると、streamが呼び出されると、ユーザアクセス要求が来る.pipe(res)読み取り可能ストリームにターゲットを指定すると、読み取り可能ストリームstreamはファイルdataから開始する.txtでデータを読み出し、res(書き込み可能なストリーム)にデータを書き込むと、resのend()メソッドが自動的に呼び出され、応答が終了し、書き込み可能なストリームは書き込まれなくなります.
四.Writableストリーム(書き込み可能ストリーム)の紹介
Writable(書き込み可能)ストリームインタフェースは、データを書き込むターゲットの抽象である.
書き込み可能なストリームの重要な2つの方法
1. write()メソッド
この方法は、下位システムにデータを書き込み、データが処理された後に、与えられたコールバックを呼び出す.
2. end()メソッド
データが書き込まれなくなった場合、このメソッドを呼び出し、書き込みを停止します.end()を呼び出した後、write()メソッドを呼び出すとエラーが発生します.
五.参考資料
1. Node.js公式APIドキュメント
http://www.nodejs.org/api/stream.html
2. 公式APIドキュメント中国語版
http://nodeapi.ucdok.com/#/api/stream.html
3.ノード内のストリーム(Stream)
http://blog.segmentfault.com/xingrz/1190000000357044
4. Node Streams: How do they work?
http://maxogden.com/node-streams.html
れんがを投げて玉を引いて、給油を続けます.
Best Regards
Kevin Song
- 2014/6/18