2012-07-03 32 views
2

我正在使用ReadLine逐行讀取一個非常大的文件,以便能夠檢測到可以將它分割成多個有意義的片段的位置,並將它們分割爲多個其他文件。我使用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(); 
     }); 
    } 
}); 

當我發現寫()失敗,我puase上的ReadLine輸入流,並聽取了「漏」事件,當我恢復它。我試着讓'聽力'的聽衆永久存在,但似乎來自ReadLine的線路不斷出現。所有文件最終都被截斷。即使在暫停時,ReadLine似乎也不會停止發送'行'事件。

最初的WriteStream(out)在此示例之前創建,我在ReadLine流上偵聽'close'事件以結束()最終文件,但無論如何,所有文件(不僅僅是最後一個)都會被截斷。

顯示屏顯示所有**暫停*讀取沿線在控制檯上的跡象,但沒有簡歷。所有的恢復**行在最後一次齊全。

在此先感謝

回答

2

我發現,這是ReadLine的錯。當ReadLine接收到一個暫停()時,它暫停自己的輸入流,但是如果它有一個已經分割成行的緩衝區,它將繼續爲已經從前一個緩衝區分離出的每一行發出'行'事件。它只會在該行數組完成時停止。我已經在Node的網站上提交了錯誤報告。