2

ReadLine を使用して、非常に大きなファイルを 1 行ずつ読み取り、それを意味のある部分に分割して他のいくつかのファイルに分割できる場所を検出できるようにしています。これらのファイルへの書き込みには、WriteStream を使用します。正規表現がカットの場所を検出すると、現在開いている WriteStream を end() し、読み取った行の新しいものを開きます。問題は、 end() 呼び出しが機能しなかったかのように、これらすべてのファイルが切り捨てられることです。

write() の成功を確認し、バッファがいっぱいになったら入力ストリームを一時停止しました。これは私のコードの関連部分です:

var rl = readline.createInterface({
    input: fs.createReadStream('basesystem.js',{encoding:'utf8'}),
    output: process.stdout
});
rl.on('line', function (line) {
    var match = rexp.exec(line);
    if (match) {
        out.end();
        console.log(path.join(PATH, match[2],'.js'));
        out = fs.createWriteStream(path.join(PATH,match[2]) + '.js', {encoding:'utf8'});

    }
    if (!out.write(line + '\n')) {
        console.log('***** paused **** ');
        rl.pause();
        out.once('drain', function () {
            console.log('***** resume **** ');
            rl.resume();
        });
    }
});

write() が失敗したことがわかったら、ReadLine で入力ストリームを停止し、再開するときに「ドレイン」イベントをリッスンします。'drain' のリスナーを永続的に残そうとしましたが、ReadLine からの行が引き続き来るようです。すべてのファイルが切り捨てられます。ReadLine は、一時停止しても「line」イベントの送信を停止していないようです。

最初の WriteStream (out) はこのサンプルの前に作成され、ReadLine ストリームの 'close' イベントをリッスンして最終ファイルを end() しますが、とにかく、最後のファイルだけでなくすべてのファイルが切り捨てられます。

ディスプレイにはすべての** 一時停止 *が表示されます読み取られている行に沿ってコンソールにサインが表示されますが、表示されません履歴書. 全てのresume **行が最後に一斉に来ます。

前もって感謝します

4

1 に答える 1

2

私は、それがReadLineのせいであることを知りました。ReadLine が pause() を受け取ると、それ自体の入力ストリームを一時停止しますが、既に行に分割されたバッファーがある場合は、前のバッファーから既に分割されている各行に対して 'line' イベントを発行し続けます。その行の配列が終了したときにのみ停止します。Nodeのサイトにバグレポートを提出しました。

于 2012-07-04T06:59:36.667 に答える