node.jsは自然に非同期でイベント駆動型であり、I/O関連のタスクの処理に最適です。アプリケーションでI/O関連操作を扱っている場合は、node.jsのストリームを利用できます。したがって、ストリームを詳細に見て、I/O操作をどのように簡素化するかを理解しましょう。
フローとは
ストリームはUNIXパイプラインであり、データソースからデータを簡単に読み取り、別の宛先に流れることができます。
簡単に言えば、ストリーミングは特別なものではなく、いくつかの方法を実装する単なるEventeMitterです。それが実装する方法によれば、ストリームは読み取り可能なストリーム(読み取り可能)、書き込み可能なストリーム(書き込み可能)、または双方向のストリーム(二重、読み取り可能で、書く可能性)になります。
読みやすいストリームを使用すると、データソースからデータを読み取ることができますが、書き込み可能なストリームを使用すると、目的地にデータを書き込むことができます。
node.jsを使用した場合、ストリーミングに遭遇した可能性があります。
たとえば、node.js HTTPサーバーでは、リクエストは読み取り可能なストリームであり、応答は書き込み可能なストリームです。
また、FSモジュールを使用している可能性があります。これにより、読みやすく執筆可能なストリームを処理するのに役立ちます。
次に、いくつかの基本を学び、さまざまな種類のフローを理解しましょう。この記事では、読みやすく執筆可能なストリームについて説明します。双方向のストリームはこの記事の範囲を超えており、それらについては説明しません。
読み取り可能なストリーム
読み取り可能なストリームを使用して、システム内のファイル、メモリ内のバッファー、または他のストリームなど、データソースからデータを読み取ることができます。ストリームはEventemittersであるため、さまざまなイベントでデータを送信します。これらのイベントを使用して、フローを機能させます。
Streamからデータを読み取ります
ストリームからデータを読み取る最良の方法は、データイベントをリッスンし、コールバック関数を追加することです。データが流れると、読み取り可能なストリームがデータイベントを送信し、コールバック関数がトリガーされます。次のコードスニペットをご覧ください。
var fs = require( 'fs'); var readableStream = fs.createreadStream( 'file.txt'); var data = ''; var readableStream.on( 'data'、function(chunk){data += chunk;}); readablestream.on( 'end'、function(){console.log(data);});fs.CreaterEadStreamは、読みやすいストリームを提供します。
最初は、このストリームはフローダイナミックではありませんでした。データのイベントリスナーを追加してコールバック関数を追加すると、流れるようになります。この後、それは小さなデータを読み取り、それをコールバック関数に渡します。
ストリームの実装者は、データイベントのトリガー周波数を決定します。たとえば、HTTPリクエストは、いくつかのKBSのデータが読み取られたときにデータイベントをトリガーします。ファイルからデータを読むと、行が終了したらデータイベントをトリガーすることにします。
読み取るデータがない場合(ファイルの最後に読み取られたとき)、ストリームはエンドイベントを送信します。上記の例では、このイベントを聞いて、ファイルの読み取りが終了したときにデータを印刷しました。
ストリームを読む別の方法があります。ファイルの最後まで読み取る前に、ストリームインスタンスでread()メソッドを呼び出し続ける必要があります。
var fs = require( 'fs'); var readableStream = fs.createreadStream( 'file.txt'); var data = ''; var chunk; readablestream.on( 'readable'、function(){while((chunk = readableStream.read()!= null){datu += chunk;}); console.log(data);});read()メソッドは、内部バッファーからデータを読み取り、読み取りデータがない場合にnullを返します。
したがって、whileループでは、read()がnullを返すかどうかを確認し、nullを返すと、ループが終了します。
ストリームからデータを読むことができれば、読み取り可能なイベントが起動されることに注意する必要があります。
セットエンコーディング
デフォルトでは、ストリームから読んだものはバッファオブジェクトです。あなたが文字列を読んでいるなら、これはあなたのためではありません。したがって、次の例のように、readable.setencoding()を呼び出すことにより、ストリームのエンコードを設定できます。
var fs = require( 'fs'); var readableStream = fs.createreadStream( 'file.txt'); var data = ''; readableStream.setEncoding( 'utf8'); readableStream.on( 'data'、function(chunk){chunk){data += chunk;}); readableStream.on(data)上記の例では、StreamのEncodingをUTF8に設定すると、データはUTF8に解析され、コールバック関数のチャンクは文字列になります。
配管
パイプラインは、ストリームの状態を自分で管理せずにデータソースからデータを読み取り、目的地に書き込むことができる優れたメカニズムです。次の例を見てみましょう。
var fs = require( 'fs'); var readableStream = fs.createreadStream( 'file1.txt'); var writableStream = fs.createwRiteStream( 'file2.txt'); readablestream.pipe(writableStream);
上記の例では、pipe()メソッドを使用して、file1のコンテンツをFile2に書き込みます。 Pipe()はデータフローの管理に役立つため、データフローの速度について心配する必要はありません。これにより、Pipe()は非常にシンプルで使いやすくなります。
Pipe()が宛先ストリームを返すことに注意する必要があるため、複数のストリームを簡単にリンクできます!
リンク(チェーン)
アーカイブファイルがあると仮定し、それを解凍したいとします。このタスクを達成するには多くの方法があります。しかし、最も簡単な方法は、パイプラインとリンクを使用することです。
var fs = require( 'fs'); var zlib = require( 'zlib'); fs.createreadstream( 'input.txt.gz').pipe(zlib.creategunzip()).pipe(fs.createwriteStream( 'output.txt'));
最初に、input.txt.gzを介して読み取り可能なストリームを作成し、zlib.creategunzip()ストリームをストリーミングします。これにより、コンテンツが減圧されます。最後に、解凍されたコンテンツを別のファイルに書き込むために、書き込み可能なストリームを追加します。
その他の方法
読みやすいストリームでいくつかの重要な概念について説明しましたが、ここにあなたが知る必要があるいくつかの方法があります。
1.Readable.Pause()この方法は、流れの流れを一時停止します。つまり、データイベントを再びトリガーすることはありません。
2.Readable.resume()メソッドは上記の反対であり、一時停止フローがフローを再開できるようにします。
3.Readable.unpipe()メソッドは宛先を削除します。パラメーターが渡された場合、読みやすいストリームがLiu Xiangの特定の目的地を停止させ、それ以外の場合はすべての目的地を削除します。
書き込み可能なストリーム
書き込み可能なストリームを使用すると、目的地にデータを書き込むことができます。読みやすいストリームと同じように、これらはイベントミッターであり、異なるイベントもトリガーします。書き込み可能なストリームでトリガーされるイベントと方法を見てみましょう。
ストリームに書き込みます
書き込み可能なストリームとしてデータを作成するには、WritibleストリームインスタンスのWrite()メソッドを呼び出して、次の例を参照する必要があります。
var fs = require( 'fs'); var readableStream = fs.createreadStream( 'file1.txt'); var writableStream = fs.createwRiteStream( 'file2.txt'); readableStream.setencoding( 'utf8');
上記のコードは非常に単純で、入力ストリームのデータを読み取り、Write()で宛先に書き込みます。
この方法は、ブール値を返して、書き込みが成功したかどうかを示します。返された場合、それは書き込みが成功し、より多くのデータを書き続けることができることを意味します。それが偽の場合、それは何かエラーが発生し、今すぐ書き続けることができないことを意味します。書き込み可能なストリームは、データを書き続けることができることを伝えるために、ドレインイベントをトリガーします。
データを書いた後
データを記述する必要がない場合は、end()メソッドを呼び出して、ストリームに書き終えたことを伝えることができます。 RESがHTTP応答オブジェクトであると仮定すると、通常、ブラウザに応答を送信します。
res.write( 'Some Data !!');
res.end();
end()が呼び出されると、すべてのデータが記述され、ストリームが仕上げイベントをトリガーします。 end()を呼び出した後、書き込み可能なストリームにデータを書き込むことができなくなることに注意してください。たとえば、次のコードにエラーが報告されます。
res.write( 'Some Data !!');
res.end();
res.write( '再び書き込もうとしている'); //エラー !
書く可能性のあるストリームに関連するいくつかの重要なイベントを次に示します。
1.執筆またはリンクでエラーが発生したときにエラーが発射します
2.パイプ読み取り可能なストリームが書き込み可能なストリームにリンクされている場合、このイベントはトリガーされます
3.アンパイプが読み取り可能なストリームによって呼び出されると、アンパイプが発射されます
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。