1、分析を開始します
Stream は、Node 内の多くのオブジェクトによって実装される抽象インターフェイスです。たとえば、HTTP サーバーへのリクエストはストリームであり、stdout もストリームです。ストリームは読み取り可能、書き込み可能、またはその両方です。
Stream への最初の取り組みは Unix の初期に始まり、数十年にわたる実践により、Stream のアイデアがいくつかの巨大なシステムを簡単に開発できることが証明されました。
Unix では、Stream は「|」によって実装されます。ノードでは、組み込みストリームモジュールとして、多くのコアモジュールとサードパーティモジュールが使用されます。
Unix と同様に、ノード ストリームの主な操作も .pipe() であり、ユーザーはアンチプレッシャー メカニズムを使用して読み取りと書き込みのバランスを制御できます。
Stream は、再利用可能な統合インターフェイスを開発者に提供し、抽象的な Stream インターフェイスを通じてストリーム間の読み取りと書き込みのバランスを制御できます。
TCP 接続は読み取り可能なストリームと書き込み可能なストリームの両方ですが、HTTP 要求オブジェクトは読み取り可能なストリームであり、http 応答オブジェクトは書き込み可能なストリームです。
ストリーム送信プロセスは、他のエンコード方式を設定しない限り、デフォルトでバッファ形式で送信されます。次に例を示します。
var サーバー = http.createServer(function(req,res){
res.writeHeader(200, {'Content-Type': 'text/plain'}) ;
res.end("こんにちは、ビッグベア!") ;
}) ;
サーバー.listen(8888) ;
console.log("http サーバーはポート 8888 で実行されています...") ;
それを変更するだけです:
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 fs = require('fs') ;
var server = http.createServer(function (req, res) {
fs.readFile(__dirname '/data.txt', function (err, data) {
res.end(data);
}) ;
}) ;
サーバー.listen(8888) ;
サイズが大きく、同時実行の量が多い場合、大量のメモリが浪費されます。ユーザーはファイル データを受け入れる前に、ファイル全体がメモリにキャッシュされるまで待つ必要があるため、結果は
になります。
ユーザーエクスペリエンスはかなり悪いです。幸いなことに、両方のパラメータ (req、res) は Stream なので、fs.readFile() の代わりに fs.createReadStream() を使用できます。以下のように:
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 は、さまざまなストリームを通じてデータ ストリームに対する操作を提供します。
大きなファイルのコピー プログラムを例として、データ ソースの読み取り専用データ ストリームを作成できます。例は次のとおりです。
rs.on('データ', 関数 (チャンク) {
doSomething(chunk); // 自由に詳細を試してください
});
rs.on('end', function () {
cleanUp() ;
}) ;
rs.on('データ', 関数 (チャンク) {
rs.pause() ;
doSomething(chunk, function () {
rs.resume() ;
}) ;
}) ;
rs.on('end', function () {
cleanUp();
}) ;
さらに、次のように、データ ターゲットの書き込み専用データ ストリームを作成することもできます。
var ws = fs.createWriteStream(dst) ;
rs.on('データ', 関数 (チャンク) {
ws.write(chunk);
}) ;
rs.on('end', function () {
ws.end();
}) ;
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();
}) ;
ファイルをコピーするより完全なプロセスは次のとおりです:
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 応答オブジェクトは可写流です

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

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

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

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

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

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

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

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


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

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

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

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

ホットトピック



