検索
ホームページウェブフロントエンドjsチュートリアルNodejs 学習メモ ストリーム module_node.js

1、分析を開始します

Stream は、Node 内の多くのオブジェクトによって実装される抽象インターフェイスです。たとえば、HTTP サーバーへのリクエストはストリームであり、stdout もストリームです。ストリームは読み取り可能、書き込み可能、​​またはその両方です。

Stream への最初の取り組みは Unix の初期に始まり、数十年にわたる実践により、Stream のアイデアがいくつかの巨大なシステムを簡単に開発できることが証明されました。

Unix では、Stream は「|」によって実装されます。ノードでは、組み込みストリームモジュールとして、多くのコアモジュールとサードパーティモジュールが使用されます。

Unix と同様に、ノード ストリームの主な操作も .pipe() であり、ユーザーはアンチプレッシャー メカニズムを使用して読み取りと書き込みのバランスを制御できます。

Stream は、再利用可能な統合インターフェイスを開発者に提供し、抽象的な Stream インターフェイスを通じてストリーム間の読み取りと書き込みのバランスを制御できます。

TCP 接続は読み取り可能なストリームと書き込み可能なストリームの両方ですが、HTTP 要求オブジェクトは読み取り可能なストリームであり、http 応答オブジェクトは書き込み可能なストリームです。

ストリーム送信プロセスは、他のエンコード方式を設定しない限り、デフォルトでバッファ形式で送信されます。次に例を示します。

コードをコピーします コードは次のとおりです:
var http = require('http') ;
var サーバー = http.createServer(function(req,res){
res.writeHeader(200, {'Content-Type': 'text/plain'}) ;
res.end("こんにちは、ビッグベア!") ;
}) ;
サーバー.listen(8888) ;
console.log("http サーバーはポート 8888 で実行されています...") ;

実行後に文字化けが発生するのは、「utf-8」などの文字セットが設定されていないことが原因です。

それを変更するだけです:

コードをコピーします コードは次のとおりです:
var http = require('http') ;
var サーバー = http.createServer(function(req,res){
res.writeHeader(200,{
'Content-Type' : 'text/plain;charset=utf-8' // charset=utf-8 を追加
}) ;
res.end("こんにちは、ビッグベア!") ;
}) ;
サーバー.listen(8888) ;
console.log("http サーバーはポート 8888 で実行されています ...") ;

実行結果:

ストリームを使用する理由

ノードの I/O は非同期であるため、ディスクとネットワークへの読み取りと書き込みにはデータを読み取るためのコールバック関数が必要です。 以下はファイルのダウンロードの例です
。 上記のコード:

コードをコピーします コードは次のとおりです:
var http = require('http') ;
var fs = require('fs') ;
var server = http.createServer(function (req, res) {
fs.readFile(__dirname '/data.txt', function (err, data) {
res.end(data);
}) ;
}) ;
サーバー.listen(8888) ;

コードは必要な機能を実現できますが、「data.txt」ファイルが非常に大きい場合、サービスはファイル データ全体をメモリにキャッシュする必要があります。

サイズが大きく、同時実行の量が多い場合、大量のメモリが浪費されます。ユーザーはファイル データを受け入れる前に、ファイル全体がメモリにキャッシュされるまで待つ必要があるため、結果は
になります。 ユーザーエクスペリエンスはかなり悪いです。幸いなことに、両方のパラメータ (req、res) は Stream なので、fs.readFile() の代わりに fs.createReadStream() を使用できます。以下のように:

コードをコピーします コードは次のとおりです:
var http = require('http') ;
var fs = require('fs') ;
var server = http.createServer(function (req, res) {
var stream = fs.createReadStream(__dirname '/data.txt') ;
Stream.pipe(res) ;
}) ;
サーバー.listen(8888) ;

.pipe() メソッドは fs.createReadStream() の 'data' および 'end' イベントをリッスンするため、「data.txt」ファイル全体をキャッシュする必要はありません
ファイルを使用すると、クライアント接続が完了した直後にデータ ブロックをクライアントに送信できます。 .pipe() を使用するもう 1 つの利点は、クライアントが
の場合に問題を解決できることです。 非常に長いエンドツーエンドの遅延によって引き起こされる読み取りと書き込みの不均衡の問題。

基本的なストリームには、読み取り可能、書き込み可能、​​変換、二重、および「クラシック」の 5 つがあります。 (具体的な使い方についてはAPIをご確認ください)

2.事例の紹介

処理する必要のあるデータを一度にメモリにロードできない場合、または読み取りと処理を同時に行う方が効率的である場合、データ ストリームを使用する必要があります。 NodeJS は、さまざまなストリームを通じてデータ ストリームに対する操作を提供します。

大きなファイルのコピー プログラムを例として、データ ソースの読み取り専用データ ストリームを作成できます。例は次のとおりです。

コードをコピーします コードは次のとおりです:
var rs = fs.createReadStream(パス名);
rs.on('データ', 関数 (チャンク) {
doSomething(chunk); // 自由に詳細を試してください
});
rs.on('end', function () {
cleanUp() ;
}) ;

コード内のデータ イベントは、doSomething 関数が処理できるかどうかに関係なく、継続的にトリガーされます。この問題を解決するために、コードを次のように引き続き変更できます。

コードをコピーします コードは次のとおりです:
var rs = fs.createReadStream(src) ;
rs.on('データ', 関数 (チャンク) {
rs.pause() ;
doSomething(chunk, function () {
rs.resume() ;
}) ;
}) ;
rs.on('end', function () {
cleanUp();
}) ;

doSomething 関数にコールバックが追加されたため、データを処理する前にデータの読み取りを一時停止し、データの処理後にデータの読み取りを続行できます。
さらに、次のように、データ ターゲットの書き込み専用データ ストリームを作成することもできます。

コードをコピーします コードは次のとおりです:
var rs = fs.createReadStream(src) ;
var ws = fs.createWriteStream(dst) ;
rs.on('データ', 関数 (チャンク) {
ws.write(chunk);
}) ;
rs.on('end', function () {
ws.end();
}) ;

doSomething が書き込み専用データ ストリームにデータを書き込むことで置き換えられた後、上記のコードはファイル コピー プログラムのように見えます。ただし、上記のコードには、書き込み速度が読み取り速度に追いつかない場合、書き込み専用データ ストリーム内のキャッシュがバーストしてしまうという問題があります。 .write メソッドの戻り値を使用して、受信データがターゲットに書き込まれるかキャッシュに一時的に配置されるかを判断できます。また、ドレイン イベントに基づいて、書き込み専用データ ストリームがいつデータを書き込んだかを判断できます。キャッシュ内でターゲットに書き込むと、次に書き込まれるデータを渡すことができます。コードは次のようになります:

コードをコピーします コードは次のとおりです:
var rs = fs.createReadStream(src) ;
var ws = fs.createWriteStream(dst) ;
rs.on('データ', 関数 (チャンク) {
If (ws.write(chunk) === false) {
rs.pause() ;
}
}) ;
rs.on('end', function () {
ws.end();
});
ws.on('ドレイン', function () {
rs.resume();
}) ;

ついに読み取り専用データフローから書き込み専用データフローへのデータ転送を実現し、防爆倉庫制御を組み込みました。上記の大きなファイルのコピー プログラムなど、これには多くの使用シナリオがあるため、NodeJS はこれを行うための .pipe メソッドを直接提供しており、その内部実装は上記のコードと似ています。

ファイルをコピーするより完全なプロセスは次のとおりです:

コードをコピー コードは次のとおりです:

var fs = require('fs'),
  パス = require('パス'),
  out = process.stdout;
var filePath = '/bb/bigbear.mkv';
var readStream = fs.createReadStream(filePath);
var writeStream = fs.createWriteStream('file.mkv');
var stat = fs.statSync(filePath);
var totalSize = stat.size;
var allowedLength = 0;
var lastSize = 0;
var startTime = Date.now();
readStream.on('data', function(chunk) {
  渡された長さ = chunk.length;
  if (writeStream.write(chunk) === false) {
    readStream.pause();
  }
});
readStream.on('end', function() {
  writeStream.end();
});
writeStream.on('ドレイン', function() {
  readStream.resume();
});
setTimeout(function show() {
  var パーセント = Math.ceil((passedLength / totalSize) * 100);
  var size = Math.ceil(passedLength / 1000000);
  var diff = サイズ - lastSize;
  lastSize = サイズ;
  out.clearLine();
  out.cursorTo(0);
  out.write('すでに完了' サイズ 'MB, ' パーセント '%, 速度:' diff * 2 'MB/s');
  if (passedLength     setTimeout(show, 500);
  } else {
    var endTime = Date.now();
    console.log();
    console.log('共用時間:' (endTime - startTime) / 1000 '秒。');
  }
}, 500);

上の日付コードを "copy.js" として保存することができます。私は setTimeout を追加して (または setInterval を直接使用して)、

500 ミリ秒ごとに完了を観察し、完了したサイズ、百分率、および圧縮速度を制御台に書き込み、圧縮が完了すると総所要時間を計算します。

三、总结一下

(1)、ストリームの概念を理解します。

(2)、熟练は関連StreamのAPIを使用します

(3)、ブロックの制御に注意してください。例: サイズファイルの一部は、「チャンクデータ」の形式で分割処理を実行します。

(4)、パイプの使用

(5)、次の概念:TCP 接続は可読ストリームであり、また可写流でもありますが、Http 接続とは異なり、http 要求オブジェクトは可読ストリームであり、http 応答オブジェクトは可写流です

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

pythonまたはjavascriptの方がいいですか?pythonまたはjavascriptの方がいいですか?Apr 06, 2025 am 12:14 AM

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

JavaScriptをインストールするにはどうすればよいですか?JavaScriptをインストールするにはどうすればよいですか?Apr 05, 2025 am 12:16 AM

JavaScriptは、最新のブラウザにすでに組み込まれているため、インストールを必要としません。開始するには、テキストエディターとブラウザのみが必要です。 1)ブラウザ環境では、タグを介してHTMLファイルを埋め込んで実行します。 2)node.js環境では、node.jsをダウンロードしてインストールした後、コマンドラインを介してJavaScriptファイルを実行します。

クォーツでタスクが開始される前に通知を送信する方法は?クォーツでタスクが開始される前に通知を送信する方法は?Apr 04, 2025 pm 09:24 PM

Quartzタイマーを使用してタスクをスケジュールする場合、Quartzでタスク通知を事前に送信する方法、タスクの実行時間はCron式によって設定されます。今...

JavaScriptでは、コンストラクターのプロトタイプチェーンで関数のパラメーターを取得する方法は?JavaScriptでは、コンストラクターのプロトタイプチェーンで関数のパラメーターを取得する方法は?Apr 04, 2025 pm 09:21 PM

JavaScriptプログラミング、プロトタイプチェーンの関数パラメーターの理解と操作のJavaScriptのプロトタイプチェーンの関数のパラメーターを取得する方法は、一般的で重要なタスクです...

WeChat MiniプログラムWebViewでVUE.JSダイナミックスタイルの変位が失敗した理由は何ですか?WeChat MiniプログラムWebViewでVUE.JSダイナミックスタイルの変位が失敗した理由は何ですか?Apr 04, 2025 pm 09:18 PM

WeChatアプレットWeb-ViewでVue.jsを使用する動的スタイルの変位障害がvue.jsを使用している理由の分析...

TamperMonkeyで複数のリンクの同時GETリクエストを実装し、順番に戻る結果を決定する方法は?TamperMonkeyで複数のリンクの同時GETリクエストを実装し、順番に戻る結果を決定する方法は?Apr 04, 2025 pm 09:15 PM

複数のリンクの同時ゲットリクエストを作成し、結果を返すために順番に判断する方法は? TamperMonkeyスクリプトでは、複数のチェーンを使用する必要があることがよくあります...

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。