Node.js v0.10系でのStreamの変更

しばらくNode.jsを触っていなかったので、復習しようと『サーバーサイドJavaScript Node.js入門』を引っ張りだしてきました。v0.8系からv0.10系に変わったのは3月のことなのでだいぶ日は経っていますが、「第8章 ストリーム、バッファ、ファイルシステム」のところに差し掛かったのでStreamの変更を思い出し覚え書き。
サーバーサイドJavaScript Node.js入門

v0.8系までは、データを取得できたときにはdataイベントが発生し、引数でchunkが渡される仕様でした(dataイベントリスナーを登録すれば、この動作はこれまでどおりサポートされはします)。v0.10系からは、新たにreadableイベントが追加され、引数ではなく自身のreadメソッドを呼ぶことでデータを取得できることになりました。これにより、強制的に引数で渡されたchunkを保持することなく必要なタイミングでデータを取得することができるようです。『サーバーサイドJavaScript Node.js入門』の例でいうと、次のようになります。まずは旧バージョン。
『サーバーサイドJavaScript Node.js入門』p.94のサンプル

var path = require('path'),
    fs = require('fs');

var filePath = path.join(__dirname, 'test.txt');

var readStream = fs.createReadStream(filePath);
readStream.setEncoding('utf8');
readStream.on('data', function(data) {
    console.log(data);
});
readStream.on('end', function() {
    console.log('end');
});
readStream.on('error', function(err) {
    console.log('An error occured');
    console.log(err);
});

上記例では、dataイベントで引数にデータのchunkが渡されてきます(8〜10行目)。この例では問題ないのですが、すぐにこれを消費したくなくても、いったんこれを保持しなければデータは失われてしまいます。これをv0.10での変更に合わせて修正すると次のようになります。
v0.10系に合わせた例

var path = require('path'),
    fs = require('fs');

var filePath = path.join(__dirname, 'test.txt');

var readStream = fs.createReadStream(filePath);
readStream.setEncoding('utf8');
readStream.on('readable', function() {
    console.log(this.read());
});
readStream.on('end', function() {
    console.log('end');
});
readStream.on('error', function(err) {
    console.log('An error occured');
    console.log(err);
});

この例ではdataイベントではなく(後方互換性があるので使えはします)、readableイベントを使用しています(8〜10行目)。今度は引数でデータのchunkが渡されるのではなく、readメソッドで現在取得可能なデータを取得しています。必要なタイミングで取得可能とはいえ、すぐに消費すべきではあるのしょうが。
それにしてもNode.js日本語書籍では一番良い本だと思うので、早く新版出してくれませんかねぇ。まだ1年も経ってませんが。