Node.js_node.js のバッファリングおよびストリーミング モジュールの詳細な紹介

WBOY
リリース: 2016-05-16 16:14:34
オリジナル
891 人が閲覧しました

バッファモジュール

js はもともとブラウザー用に設計されたため、Unicode でエンコードされた文字列をうまく処理できますが、バイナリ データをうまく処理できません。 Node.js は、多くの場合バイナリ形式でネットワーク経由でデータを送受信するように設計されているため、これは Node.js の問題です。例:

- TCP 接続経由でデータを送受信します。
- 画像または圧縮ファイルからバイナリ データを読み取ります。
- ファイル システムからのデータの読み取りと書き込み
- ネットワークからのバイナリ データ ストリームを処理します

Buffer モジュールは、生データを Node.js に保存する方法を提供するため、js のコンテキストでバイナリ データを使用できます。 Node.js の I/O 操作で移動されたデータを処理する必要がある場合は、常に Buffer モジュールを使用できます。

クラス: バッファ

Buffer クラスは、バイナリ データを直接処理するために使用されるグローバル変数タイプです。 さまざまな方法で構築できます。

元のデータは Buffer クラスのインスタンスに保存されます。 Buffer インスタンスは整数配列

に似ています。

1.new Buffer(size): サイズが 8 ビット バイトの新しいバッファを割り当てます。 2.new Buffer(array): 8 ビットのバイト配列
を使用して新しいバッファを割り当てます。 3.new Buffer(str, [encoding]):encoding 文字列型 - 使用するエンコーディング方法。パラメータはオプションです。

4. クラス メソッド: Buffer.isEncoding(encoding): 指定されたエンコーディングが有効な場合は true を返し、それ以外の場合は false を返します。

5. クラスメソッド: Buffer.isBuffer(obj): この obj が Buffer であるかどうかをテストします。Return Boolean
。 6. クラスメソッド: Buffer.concat(list, [totalLength]): list {Array} 配列型、バッファ配列、接続されていました。 totalLength {Number} 型 上記のバッファ配列内のすべてのバッファの合計サイズ。
ファイルを読み取ってバッファのインスタンスを取得するだけでなく、次のように直接構築することもできます。

var bin = 新しいバッファ([ 0x48, 0x65, 0x6c, 0x6c, 0x6c ]);


バッファは文字列に似ています。 .length 属性を使用してバイト長を取得するだけでなく、[index] メソッドを使用して指定された位置のバイトを読み取ることもできます。たとえば、


bin[0]; // => 0x48;


たとえば、指定されたエンコーディングを使用して、バッファと文字列を相互に変換できます。


var str = bin.toString('utf-8'); // =>

.slice メソッドは新しいバッファーを返しませんが、以下に示すように、元のバッファーの中央の位置へのポインターを返すのと似ています。


コードをコピー コードは次のとおりです: 1.[ 0x48、0x65、0x6c、0x6c、0x6c ]
2. ^ ^ ^
3. |
4. ビン bin.slice(2)



書き込みバッファ


コードをコピーします コードは次のとおりです: varbuffer = new Buffer(8);//8バイトのメモリを割り当てたバッファを作成します
console.log(buffer.write('a','utf8'));//出力 1


これにより、文字「a」がバッファに書き込まれ、ノードはエンコード後にバッファに書き込まれたバイト数を返します。ここでの文字 a の UTF-8 エンコードは 1 バイトを占めます。

バッファをコピー

Node.js は、Buffer オブジェクトの内容全体を別の Buffer オブジェクトにコピーするメソッドを提供します。既存の Buffer オブジェクト間でのみコピーできるため、Buffer オブジェクトを作成する必要があります。


コードをコピー コードは次のとおりです: buffer.copy(bufferToCopyTo)


このうち、bufferToCopyTo はコピー対象の Buffer オブジェクトです。以下の例:


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

varbuffer1 = 新しいバッファ(8);
buffer1.write('初めまして','utf8');
varbuffer2 = 新しいバッファ(8);
バッファ1.コピー(バッファ2);
console.log(buffer2.toString());//初めまして

ストリームモジュール

UNIX タイプのオペレーティング システムでは、ストリームは標準概念です。次の 3 つの主要なストリームがあります:

1.標準入力
2.標準出力
3.標準誤差

読み取り可能なストリーム

Node.js が生データを処理する方法がバッファーである場合、通常、Node.js がデータを移動する方法はストリームです。 Node.js のストリームは読み取り可能または書き込み可能です。 Node.js の多くのモジュールは、HTTP やファイル システムなどのストリームを使用します。

このデータを使用するために、classesmates.txt ファイルを作成し、そこから名前のリストを読み取るとします。データはストリームであるため、ファイルの読み取りが完了する前に、最初の数バイトからデータを操作できることを意味します。これは Node.js の一般的なパターンです。

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

var fs = require('fs');
var stream = fs.ReadStream('classmates.txt');
stream.setEncoding('utf8');
stream.on('データ', 関数 (チャンク) {
console.log('データを読み取る')
});
stream.on('close', function () {
console.log('すべてのデータが読み取られています')
});

上記の例では、新しいデータを受信したときにイベント データがトリガーされます。ファイルの読み取りが完了すると、close イベントがトリガーされます。

書き込み可能なストリーム

もちろん、データを書き込むための書き込み可能なストリームを作成することもできます。これは、単純なスクリプトを使用して、ストリームを使用してファイルを読み取り、別のファイルに書き込むことができることを意味します。

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

var fs = require('fs');
var readableStream = fs.ReadStream('classmates.txt');
var writableStream = fs.writeStream('names.txt');
readableStream.setEncoding('utf8');
readableStream.on('data', 関数 (チャンク) {
writableStream.write(チャンク);
});
readableStream.on('close', function () {
writeableStream.end();
});

データ イベントを受信すると、データが書き込み可能なストリームに書き込まれるようになりました。

readable.setEncoding(encoding): return: this

readable.resume(): 上記と同じ。このメソッドを使用すると、読み取り可能なストリームがデータ イベントを発生し続けることができます。

readable.pause(): 上記と同じ。このメソッドにより、フロー モードのストリームがデータ イベントの発生を停止し、非フロー モードに切り替わり、後続の使用可能なデータが内部バッファに残されます。
クラス: stream.Writable

Writable ストリーム インターフェイスは、ターゲットに書き込むデータを抽象化したものです。

1.writable.write(チャンク, [エンコーディング], [コールバック]):

チャンク {String | Buffer} 書き込むデータ
エンコーディング {String} エンコーディング、チャンクが文字列
の場合 callback {Function} データブロックが書き込まれた後のコールバック
戻り値: {Boolean} データが完全に処理された場合は true。

このメソッドは、基礎となるシステムにデータを書き込み、データが処理された後に指定されたコールバックを呼び出します。

2.writable.cork(): すべての書き込みを強制的に維持します。

保持されたデータは、.uncork() または .end() が呼び出されたときに書き込まれます。

3.writable.end([チャンク], [エンコーディング], [コールバック])

チャンク {String | Buffer} はオプション、書き込まれるデータ
エンコーディング {String} エンコーディング、チャンクが文字列
の場合 callback {Function} オプション、ストリーム終了後のコールバック
end() を呼び出した後に write() を呼び出すとエラーが生成されます。

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

// 「hello,」と書き、「world!」で終わります
http.createServer(function (req, res) {
res.write('こんにちは、');
res.end('世界!');
// 現在、これ以上の書き込みは許可されていません
});
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!