写入流最终溢出

时间:2012-07-03 17:49:03

标签: node.js stream readline

我正在使用ReadLine逐行读取一个非常大的文件,以便能够检测到我可以将其分成多个其他文件的有意义的部分。我使用WriteStream写入这些文件。当正则表达式检测到剪切的位置时,我结束()当前打开的WriteStream并为刚读取的行打开一个新的WriteStream。问题是所有这些文件最终被截断,好像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'事件以结束()最终文件,但无论如何,所有文件(而不仅仅是最后一个文件)都会被截断。

显示屏会在控制台上显示所有 ** pause * 标志,但不会显示 恢复 。所有 简历** 行都会在结尾处同时出现。

提前致谢

1 个答案:

答案 0 :(得分:2)

我发现,这是ReadLine的错。当ReadLine收到pause()时,它会暂停自己的输入流,但如果它有一个已经分割成行的缓冲区,它将继续为已经从前一个缓冲区分割的每一行发出“line”事件。它只会在完成该行数组时停止。我已经在Node的网站上提交了错误报告。