情報アイランド

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

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

独自の書き込みストリームを作成するにはstream.Writableクラスのコンストラクタかflush-write-streamモジュールのflushWriteStream関数を使用します。

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

var stream = require('stream');

var writable = new stream.Writable({
    objectMode: false, 
    highWaterMark: 16384, 
    decodeStrings: true, 
    write: function (chunk, encoding, callback) {
        callback(null);
        //or
        callback(new Error('xxx'));
    }, 
    writev: function (chunks, callback) {
        callback(null);
        //or
        callback(new Error('yyy'));
    }
});

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

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

  • objectMode・・・文字列やバッファ以外のデータの書き込みが可能であるかを真偽値として指定します。デフォルトはfalseです。
  • highWaterMark・・・未処理のデータがバッファに溜まり過ぎているかどうかの基準を未処理のデータの長さとして指定します。この書き込みストリームのwrite関数を呼び出した際に、データを処理した後の未処理のデータの長さがこの長さより長くなっている場合には返り値としてfalseが返り、長くなっていない場合にはtrueが返ります。デフォルトは16384です。ただし、objectModeオプションがtrueである場合には16です。
  • decodeStrings・・・書き込まれた文字列をバッファに変換するかを真偽値として指定します。デフォルトはtrueです。
  • write・・・データの書き込み処理を関数として指定します。この関数の第1引数はデータであり、第2引数は文字コードであり、第3引数はコールバック関数です。書き込み処理が完了した場合や書き込み処理の実行中にエラーが発生した場合には必ずこのコールバック関数を呼び出さなければなりません。このコールバック関数の第1引数にはエラーオブジェクト(エラーが発生しなかった場合にはnull)を指定します。
  • writev・・・データの書き込み処理を関数として指定します。この関数の第1引数は複数のデータであり、第2引数はコールバック関数です。書き込み処理が完了した場合や書き込み処理の実行中にエラーが発生した場合には必ずこのコールバック関数を呼び出さなければなりません。このコールバック関数の第1引数にはエラーオブジェクト(エラーが発生しなかった場合にはnull)を指定します。このオプションは指定しなくても構いませんこのオプションは複数のデータの書き込みに対応する場合に指定します

flushWriteStream関数

var flushWriteStream = require('flush-write-stream');

var writable = flushWriteStream({
    objectMode: false, 
    highWaterMark: 16384, 
    decodeStrings: true
}, function (chunk, encoding, callback) {
    callback(null);
    //or
    callback(new Error('xxx'));
}, function (callback) {
    callback(null);
    //or
    callback(new Error('yyy'));    
});

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

第2引数にデータの書き込み処理を関数として指定します。この関数はstream.Writableクラスのコンストラクタの第1引数のwriteオプションと同じです。

第3引数にデータの書き込み処理が完了した場合に呼び出される処理を関数として指定します。この引数は指定しなくても構いません。この関数の第1引数はコールバック関数です。処理が完了した場合や処理の実行中にエラーが発生した場合には必ずこのコールバック関数を呼び出さなければなりません。このコールバック関数の第1引数にはエラーオブジェクト(エラーが発生しなかった場合にはnull)を指定します。

サンプルコード1

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

標準出力に装飾した文字列を出力する書き込みストリームを作成します。

writable.js

var stream = require('stream');

var writable = new stream.Writable({
    decodeStrings: false, 
    write: function (chunk, encoding, callback) {
        if (chunk.length > 10) {
            console.log('** %s... **', chunk.substring(0, 10));
        }
        else {
            console.log('** %s **', chunk);
        }
        callback(null);
    }
});
writable.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

writable.write('foo');
writable.write('foofoo');
writable.write('foofoofoo');
writable.write('foofoofoofoo');
writable.write('foofoofoofoofoo');
writable.end();

実行結果

C:\work\node>node writable.js
** foo **
** foofoo **
** foofoofoo **
** foofoofoof... **
** foofoofoof... **

サンプルコード2

flushWriteStream関数の使用例です。

標準出力に装飾した文字列を出力する書き込みストリームを作成します。

flush-write-stream.js

var flushWriteStream = require('flush-write-stream');

var writable = flushWriteStream({
    decodeStrings: false
}, function (chunk, encoding, callback) {
    if (chunk.length > 10) {
        console.log('** %s... **', chunk.substring(0, 10));
    }
    else {
        console.log('** %s **', chunk);
    }
    callback(null);
}, function (callback) {
    console.log('ended.');
    callback(null);
});
writable.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

writable.write('foo');
writable.write('foofoo');
writable.write('foofoofoo');
writable.write('foofoofoofoo');
writable.write('foofoofoofoofoo');
writable.end();

使用パッケージ

実行結果

C:\work\node>node flush-write-stream.js
** foo **
** foofoo **
** foofoofoo **
** foofoofoof... **
** foofoofoof... **
ended.

関連

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

-Node.js