Node.js ストリームは、大量のデータを効率的に処理するために不可欠な機能です。従来の入出力メカニズムとは異なり、ストリームを使用すると、データ全体をメモリにロードするのではなく、データをチャンク単位で処理できるため、大きなファイルやリアルタイム データの処理に最適です。この記事では、Node.js ストリームとは何か、それが役立つ理由、実装方法、さまざまな種類のストリームについて、詳細な例と使用例を交えて詳しく説明します。
簡単に言うと、ストリームとは、時間の経過とともにあるポイントから別のポイントに移動される一連のデータです。データが一度に流れるのではなく、少しずつ流れるベルトコンベアと考えることができます。
Node.js ストリームも同様に機能します。データを (一度にすべてではなく) 分割して読み書きできるため、メモリ効率が高くなります。
Node.js のストリームは EventEmitter の上に構築され、イベント駆動型になります。いくつかの重要なイベントは次のとおりです:
ストリームには、I/O を処理するための fs.readFile() や fs.writeFile() などの従来のメソッドに比べて、いくつかの利点があります。
Node.js には 4 種類のストリームがあります:
各タイプを例を挙げて見てみましょう。
読み取り可能なストリームは、データをチャンクごとに読み取るために使用されます。たとえば、大きなファイルを読み取る場合、読み取り可能なストリームを使用すると、ファイル全体を読み込むのではなく、データの小さな塊をメモリに読み取ることができます。
const fs = require('fs'); // Create a readable stream const readableStream = fs.createReadStream('largefile.txt', { encoding: 'utf8' }); // Listen for data events and process chunks readableStream.on('data', (chunk) => { console.log('Chunk received:', chunk); }); // Listen for the end event when no more data is available readableStream.on('end', () => { console.log('No more data.'); }); // Handle error event readableStream.on('error', (err) => { console.error('Error reading the file:', err); });
説明:
書き込み可能なストリームは、データをチャンクごとに書き込むために使用されます。すべてのデータを一度に書き込む代わりに、ファイルまたは別の書き込み可能な宛先にストリーミングできます。
const fs = require('fs'); // Create a writable stream const writableStream = fs.createWriteStream('output.txt'); // Write chunks to the writable stream writableStream.write('Hello, World!\n'); writableStream.write('Streaming data...\n'); // End the stream (important to avoid hanging the process) writableStream.end('Done writing.\n'); // Listen for the finish event writableStream.on('finish', () => { console.log('Data has been written to output.txt'); }); // Handle error event writableStream.on('error', (err) => { console.error('Error writing to the file:', err); });
説明:
二重ストリームはデータの読み取りと書き込みの両方ができます。二重ストリームの典型的な例は、データを同時に送受信できるネットワーク ソケットです。
const { Duplex } = require('stream'); const duplexStream = new Duplex({ write(chunk, encoding, callback) { console.log(`Writing: ${chunk.toString()}`); callback(); }, read(size) { this.push('More data'); this.push(null); // End the stream } }); // Write to the duplex stream duplexStream.write('Hello Duplex!\n'); // Read from the duplex stream duplexStream.on('data', (chunk) => { console.log(`Read: ${chunk}`); });
説明:
変換ストリームは、ストリームを通過するときにデータを変更します。たとえば、変換ストリームはデータを圧縮、暗号化、または操作できます。
const { Transform } = require('stream'); // Create a transform stream that converts data to uppercase const transformStream = new Transform({ transform(chunk, encoding, callback) { this.push(chunk.toString().toUpperCase()); callback(); } }); // Pipe input to transform stream and then output the result process.stdin.pipe(transformStream).pipe(process.stdout);
説明:
Node.js ストリームの重要な機能の 1 つは、パイプ処理できることです。パイピングを使用すると、ストリームを連鎖させて、あるストリームの出力を入力として別のストリームに渡すことができます。
const fs = require('fs'); // Create a readable stream for the input file const readableStream = fs.createReadStream('input.txt'); // Create a writable stream for the output file const writableStream = fs.createWriteStream('output.txt'); // Pipe the readable stream into the writable stream readableStream.pipe(writableStream); // Handle errors readableStream.on('error', (err) => console.error('Read error:', err)); writableStream.on('error', (err) => console.error('Write error:', err));
説明:
Node.js ストリームは、チャンク内のデータを操作することで I/O 操作を処理する強力かつ効率的な方法を提供します。大きなファイルを読み取る場合でも、ソース間でデータをパイプする場合でも、オンザフライでデータを変換する場合でも、ストリームはメモリ効率が高くパフォーマンスの高いソリューションを提供します。アプリケーションで読み取り可能、書き込み可能、二重、および変換ストリームを活用する方法を理解すると、アプリケーションのパフォーマンスとスケーラビリティを大幅に向上させることができます。
以上がNode.js ストリームについて: 何を、なぜ、どのように使用するのかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。