この記事では、node.js ストリーム API を最も単純なものからより深いものまで紹介します。具体的な詳細については、以下を参照してください。
基本的な紹介
Node.js では、ファイルを読み取る方法は 2 つあり、1 つは fs.readFile を使用する方法、もう 1 つは fs.createReadStream を使用して読み取る方法です。
fs.readFile は、すべての Node.js ユーザーにとって最も馴染みのあるもので、理解しやすく、使いやすいです。ただし、大きなファイルに遭遇すると、すべてのデータが最初にメモリに読み込まれるため、この方法での読み取り効率が非常に低いという欠点があります。
そして、fs.createReadStream は Stream を通じてデータを読み取り、ファイル (データ) を小さな部分に分割し、これらのイベントをリッスンして特定の処理関数を記述することができます。この方法は上記の方法に比べて簡単ではありませんが、非常に効率的です。
実際、Stream は Node.js でのファイル処理に使用されるだけでなく、process.stdin/stdout、http、tcp ソケット、zlib、crypto などの他の場所でも見ることができます。
この記事は、Node.js の Stream API について学習した内容をまとめたものであり、皆様のお役に立てれば幸いです。
特徴
イベント通信に基づく
ストリームはパイプを介して接続可能
タイプ
読み取り可能なストリーム読み取り可能なデータストリーム
書き込み可能なストリーム書き込み可能なデータストリーム
二重ストリーム双方向データストリーム、同時に読み取りと書き込みが可能
Transform Stream は、読み取りと書き込みが可能なデータ ストリームを変換し、同時にデータを変換 (処理) できます
event
readable データ ストリーム イベント
readable は、データが流出するとトリガーされます
data明示的に一時停止されていないストリームに対して、データ イベント リスニング関数を追加すると、データ フローがフロー ダイナミクスに切り替わり、できるだけ早くデータが外部に提供されます
データが読み取られると end がトリガーされます。 writeableStream.end() と混同しないように注意してください。writeableStream には終了イベントはなく、.end() メソッドのみです
データ ソースが閉じられると close がトリガーされます
error は読み取り中にエラーが発生するとトリガーされますdata
書き込み可能なデータストリームのイベント
ドレイン writable.write(chunk) false を返した後、キャッシュが完全に書き込まれ、書き換え可能になったときにトリガーされます。.end メソッドが呼び出されたときにトリガーされます。すべてのキャッシュされたデータが解放された後、読み取り可能なデータ ストリームと同様に、書き込みプロセスの終了を示します
パイプ ターゲットとして機能するときにパイプがトリガーされます
アンパイプ ターゲットとして機能するときにトリガーされます
エラーデータの書き込み時にエラーが発生したときにトリガーされます
状態
読み取り可能なデータ フローには、フロー ダイナミクスと一時停止状態の 2 つの状態があります。データ フローの状態を変更する方法は次のとおりです。データ イベントのリスニング関数
再開メソッドを呼び出します
パイプ メソッドを呼び出します
注: フロー ダイナミクスに変換される場合、データ イベントのリスニング関数がなく、パイプ メソッドの宛先がない場合、データは失われます。
ストリームダイナミクス->一時停止状態
パイプメソッドの宛先がない場合は、一時停止メソッドを呼び出します
パイプメソッドの宛先がある場合は、すべてのデータイベントリスニング関数を削除し、unpipeメソッドを呼び出しますすべて削除 パイプ メソッドの宛先
注: データ イベントのリッスン関数を削除するだけでは、データ フローが自動的に「一時停止状態」になるわけではありません。さらに、パイプ メソッドの宛先がある場合に一時停止メソッドを呼び出しても、それらの宛先がデータ要求を発行した後、データ フローが常に一時停止されるとは限りません。
使用方法
ファイルの読み取りと書き込み
var fs = require('fs'); // 新建可读数据流 var rs = fs.createReadStream('./test1.txt'); // 新建可写数据流 var ws = fs.createWriteStream('./test2.txt'); // 监听可读数据流结束事件 rs.on('end', function() { console.log('read text1.txt successfully!'); }); // 监听可写数据流结束事件 ws.on('finish', function() { console.log('write text2.txt successfully!'); }); // 把可读数据流转换成流动态,流进可写数据流中 rs.pipe(ws); 读取 CSV 文件,并上传数据(我在生产环境中写过) var fs = require('fs'); var es = require('event-stream'); var csv = require('csv'); var parser = csv.parse(); var transformer = csv.transform(function(record) { return record.join(','); }); var data = fs.createReadStream('./demo.csv'); data .pipe(parser) .pipe(transformer) // 处理前一个 stream 传递过来的数据 .pipe(es.map(function(data, callback) { upload(data, function(err) { callback(err); }); })) // 相当于监听前一个 stream 的 end 事件 .pipe(es.wait(function(err, body) { process.stdout.write('done!'); }));
詳細な使用方法
については、サンプル Web サイトに入った後、[ストリームの追加] を直接クリックして確認できます。結果。
よくある落とし穴
rs.pipe(ws) を使用してファイルを書き込むと、rs のコンテンツが ws の後ろに追加されず、ws の元のコンテンツが rs のコンテンツで直接上書きされます
終了/クローズされたストリームはできません再利用され、データ ストリームを再作成する必要があります
パイプ メソッドは、a.pipe(b) が b を返すなど、ターゲット データ ストリームを返します。そのため、イベントをリッスンするときは、監視しているオブジェクトが正しいです
必要に応じて、複数のデータ ストリームを監視し、パイプ メソッドを使用してデータ ストリームを直列に接続する場合は、次のように記述する必要があります:
data
.on('end', function() { console.log('data end'); }) .pipe(a) .on('end', function() { console.log('a end'); }) .pipe(b) .on('end', function() { console.log('b end'); });
共通クラス ライブラリ
event-stream は関数型プログラミングのように感じられます。個人的に気に入っているものを使用しています
awesome-nodejs#streams 他のストリームライブラリを使ったことがないので、必要な場合はここを読んでください
上記の内容は、エディターが紹介したNode.jsでのStream APIの使用です。 気に入ってくれるといいな。
Node.js での Stream API の使用に関するその他の記事については、PHP 中国語 Web サイトに注目してください。