ストリームとは何ですか?
Node.js では、Stream はデータを処理するための抽象インターフェイスです。データ全体を一度にメモリにロードすることなく、大量のデータを読み書きする効率的な方法を提供します。
ストリームは、データ全体の準備が整うのを待たずに次々に送信できる、順序付けられたデータ チャンクのシーケンスとみなすことができます。ストリームは、ある場所からデータを読み取り、それを別の場所に転送して処理できるため、すべてのデータが完全にロードされるのを待たずに、処理中にデータを段階的に受信できます。
Node.js のストリームは、読み取り可能ストリーム (Readable)、書き込み可能ストリーム (Writable)、読み取り可能および書き込み可能ストリーム (Duplex)、および変換ストリーム (Transform) に分割できます。各タイプのフローには、異なる特性と使用シナリオがあります。
読み取り可能なストリーム (読み取り可能)
読み取り可能なストリームは、ソースからデータを読み取るストリームです。ソースには、ファイル、ネットワーク接続、またはその他のデータ ソースを指定できます。読み取り可能なストリームは、データを段階的に取得するためのメカニズムを提供し、実際のニーズに応じてデータをバッチで読み取ることができます。
読み取り可能なストリームを作成する
Node.js では、読み取り可能なストリーム オブジェクトを作成することでデータを読み取ることができます。以下は、読み取り可能なストリームを作成する方法を示す例です。
const fs = require('fs');
const readableStream = fs.createReadStream('file.txt');
file.txt
上記のコードは、指定されたファイルからデータを読み取るReadable ストリームを作成します。
読み取りデータ
読み取り可能なストリームからデータを読み取るには、data
イベントをリッスンすることで実行できます。新しいデータ ブロックが利用可能になるとイベントが発生しdata
、そのデータ ブロックを引数として渡します。
以下は、読み取り可能なストリームからデータを読み取る方法を示す例です。
readableStream.on('data', (chunk) => {
console.log('接收到数据块:', chunk);
});
上記の例では、読み取り可能なストリームがデータの新しいチャンクを受信するたびに、そのチャンクのコンテンツを出力します。
終了イベント
読み取り可能なストリームは、end
すべてのデータが読み取られたことを示すイベントもトリガーします。end
イベント リスナーでいくつかのクリーンアップ操作を実行するか、次のステップに進むことができます。
end
以下は、読み取り可能なストリームでイベントをリッスンする方法を示す例です。
readableStream.on('end', () => {
console.log('数据读取完毕');
});
上記の例では、読み取り可能なストリームがすべてのデータを読み取ると、end
イベントがトリガーされ、対応する情報が出力されます。
書き込み可能なストリーム (書き込み可能)
書き込み可能なストリームは、ターゲットの場所にデータを書き込むストリームです。ターゲットの場所には、ファイル、ネットワーク接続、またはその他のデータ ストレージの場所を指定できます。書き込み可能なストリームは、必要に応じてデータをチャンクごとに段階的に書き込むためのメカニズムを提供します。
書き込み可能なストリームを作成する
Node.js では、書き込み可能なストリーム オブジェクトを作成することで、ターゲットの場所にデータを書き込むことができます。以下は、書き込み可能なストリームを作成する方法を示す例です。
const fs = require('fs');
const writableStream = fs.createWriteStream('output.txt');
output.txt
前述のコードは、指定されたファイルにデータを書き込む書き込み可能なストリームを作成します。
データ入力
書き込み可能なストリームにデータを書き込むには、write
メソッドを使用します。write
このメソッドはデータのチャンクを引数として受け取り、それをストリームに書き込みます。
以下は、書き込み可能なストリームにデータを書き込む方法を示す例です。
writableStream.write('Hello, world!');
上の例では、テキスト データを書き込み可能なストリームに書き込みました。
エンドストリーム
すべてのデータが書き込み可能なストリームに書き込まれた後、end
メソッドを呼び出してストリームを終了する必要があります。ストリームが終了すると、新しいチャンクは受け入れられなくなります。
以下は、書き込み可能なストリームを終了する方法を示す例です。
writableStream.end();
上の例では、end
書き込み可能なストリームを終了するメソッドを呼び出しました。
読み取りおよび書き込み可能なストリーム (二重)
読み取り/書き込みストリームは、データの読み取りと書き込みの両方ができるストリームです。読み取り可能なストリームと書き込み可能なストリームの両方を実装します。読み取りおよび書き込み可能なストリームは、ネットワーク接続などの一部のシナリオで非常に役立ちます。
読み取りおよび書き込み可能なストリームを作成する
Node.js では、読み取り/書き込みストリーム オブジェクトを作成することで、データの読み取りと書き込みの双方向フローを実現できます。以下は、読み取りおよび書き込み可能なストリームを作成する方法を示す例です。
const net = require('net');
const duplexStream = new net.Socket();
上記のコードは、読み取りおよび書き込み可能なストリーム オブジェクトを作成し、net
モジュールを使用して TCP ソケット (Socket) を作成します。
データの読み取りと書き込み
読み取り/書き込みストリームは、データの読み取りと書き込みの両方が可能です。data
イベントをリッスンすることで読み取りおよび書き込み可能なストリームのデータを読み取り、write
メソッドを呼び出すことで読み取りおよび書き込み可能なストリームにデータを書き込むことができます。
以下は、読み取りおよび書き込み可能なストリームに対してデータを読み書きする方法を示す例です。
duplexStream.on('data', (chunk) => {
console.log('接收到数据:', chunk);
});
duplexStream.write('Hello, world!');
上の例では、読み取り可能および書き込み可能なストリームのイベントをリッスンしdata
、新しいデータ ブロックが利用可能になると、データ ブロックのコンテンツを出力します。次に、write
メソッドを通じて読み取りおよび書き込み可能なストリームにデータを書き込みます。
変換の流れ(Transform)
変換ストリームは、入力データを出力する前に変換する特別な読み取り/書き込みストリームです。変換ストリームは、データの圧縮、暗号化、解析など、実際の開発において非常に役立ちます。
変換フローを作成する
Node.js では、変換ストリーム オブジェクトを作成することでデータ変換を実装できます。以下は、変換ストリームの作成方法を示す例です。
const {
Transform } = require('stream');
const myTransform = new Transform({
transform(chunk, encoding, callback) {
// 在这里处理数据转换逻辑
const transformedData = chunk.toString().toUpperCase();
this.push(transformedData);
callback();
}
});
上記のコードは、変換ストリーム オブジェクトを作成しmyTransform
、transform
メソッドを通じてデータ変換ロジックを定義します。この例では、入力チャンクを大文字に変換し、push
変換されたチャンクをメソッドを介して読み取り可能な側にプッシュします。
遷移ストリームを使用する
変換ストリームを使用してデータを変換するには、入力データ ストリームと出力データ ストリームの間に変換ストリームを挿入します。データが変換ストリームを通過すると、transform
メソッドで定義した変換ロジックに従って処理されます。
データ変換に変換ストリームを使用する方法を示す例を次に示します。
const fs = require('fs');
const readableStream = fs.createReadStream('input.txt');
const writableStream = fs.createWriteStream('output.txt');
readableStream.pipe(myTransform).pipe(writableStream);
上の例では、読み取り可能なストリームと書き込み可能なストリームを作成しました。そこで、読み取り可能なストリームと書き込み可能なストリームの間にpipe
変換ストリームを挿入するメソッドを使用して、データの変換と出力を実現します。myTransform
結論は
Node.js のストリームは、大量のデータを処理する効率的な方法を提供します。読み取り可能ストリーム、書き込み可能ストリーム、読み取り可能および書き込み可能ストリーム、および変換ストリームはすべて異なる特性と用途を持っており、実際のニーズに応じて適切なストリーム タイプを選択できます。
この記事では、Node.js でのストリームの概念、作成、使用法を詳しく紹介し、対応するサンプル コードを提供します。この記事を通じて、Node.js のフローについて理解を深め、実際の開発においてフローの機能を柔軟に活用してデータを処理できるようになれば幸いです。