情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsで独自の読み込みストリームを作成する

独自の読み込みストリームを作成するにはstream.Readableクラスのコンストラクタかfrom2モジュールのfrom2関数を使用します。

stream.Readableクラスのコンストラクタ

var stream = require('stream');

var readable = new stream.Readable({
    objectMode: false, 
    highWaterMark: 16384, 
    encoding: null, 
    read: function (size) {
        this.push('xxx', 'yyy');
    }
});

第1引数にオプションをオブジェクトとして指定します。

オプションには下のようなものがあります。

  • objectMode・・・文字列やバッファ以外のデータの読み込みが可能であるかを真偽値として指定します。デフォルトはfalseです。
  • highWaterMark・・・バッファに溜める未処理のデータの長さの最大値を指定します。デフォルトは16384です。ただし、objectModeオプションがtrueである場合には16です。
  • encoding・・・読み込まれたバッファの文字コードを指定します。nullの場合には読み込まれたバッファは文字列に変換されません。デフォルトはnullです。
  • read・・・データの読み込み処理を関数として指定します。この関数の第1引数は読み込むデータのバイト数に対する助言です。このバイト数はあくまでも助言なので遵守する必要はありません。この関数では読み込んだデータをthis.push関数を使用してバッファに追加するようにします。この関数の第1引数にはデータを指定し、第2引数には文字コードを指定します。第2引数は指定しなくても構いません。バッファへのデータの追加はthis.push関数の返り値がfalseになるまで行うようにします。なお、全てのデータを読み込み終わった場合には第1引数にnullを指定してthis.push関数を呼び出すようにします。

from2関数

var from2 = require('from2');

var readable = from2({
    objectMode: false, 
    highWaterMark: 16384, 
    encoding: null
}, function (size, callback) {
    callback(null, 'xxx');
    //or
    callback(null, null);
    //or
    callback(new Error('yyy'), null);
});

第1引数にオプションをオブジェクトとして指定します。このオプションはstream.Readableクラスのコンストラクタの第1引数のオプションと同じです。この引数は指定しなくても構いません。

第2引数にデータの読み込み処理を関数として指定します。この関数の第1引数は読み込むデータのバイト数に対する助言であり、第2引数はコールバック関数です。第1引数のバイト数はあくまでも助言なので遵守する必要はありません。読み込み処理が完了した場合や読み込み処理の実行中にエラーが発生した場合には必ず第2引数のコールバック関数を呼び出さなければなりません。このコールバック関数の第1引数にはエラーオブジェクト(エラーが発生しなかった場合にはnull)を指定し、第2引数には読み込んだデータ(エラーが発生した場合にはnull)を指定します。ただし、全てのデータを読み込み終わった場合にはnullを指定します。

サンプルコード1

stream.Readableクラスのコンストラクタの使用例です。

乱数を10個生成する読み込みストリームを作成します。

readable.js

var stream = require('stream');

var i = 0;
var readable = new stream.Readable({
    objectMode: true, 
    read: function (size) {
        var f = true;
        for (; i < 10 && f; i++) {
            f = this.push(Math.random());
        }
        if (i == 10) {
            this.push(null);
        }
    }
});
readable.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

readable.on('data', function (r) {
    console.log(r);
});
readable.on('end', function () {
    console.log('end.');
});

実行結果

C:\work\node>node readable.js
0.6350611116755813
0.25088523382817707
0.3795336411748378
0.9793470079477733
0.6721796979839114
0.9179521518568798
0.2371197016563764
0.11243276008884373
0.6216930822401394
0.3614352312634441
end.

サンプルコード2

from2関数の使用例です。

乱数を10個生成する読み込みストリームを作成します。

from2.js

var from2 = require('from2');

var i = 0;
var readable = from2({
    objectMode: true
}, function (size, callback) {
    i++;
    if (i <= 10) {
        callback(null, Math.random());
    }
    else {
        callback(null, null);
    }
});
readable.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

readable.on('data', function (r) {
    console.log(r);
});
readable.on('end', function () {
    console.log('end.');
});

使用パッケージ

  • from2
    npm install from2でインストールします。

実行結果

C:\work\node>node from2.js
0.1470050398536349
0.22996360118686132
0.9130191042425191
0.1574099221136731
0.1218821689543439
0.05115606194840483
0.1537266400740469
0.2665206724840974
0.6435280347634569
0.8166234296148818
end.

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js