2017-07-07 54 views
1

我需要定期使用大型未格式化的只讀文本文件,並檢查每個文件中是否存在特定內容/文字。該文件由所有字母數字字符組成。但是,我遇到問題,甚至讀到這些大型靜態文件之一的流的end使用NodeJS流式傳輸大型靜態文件

下面是我試圖運行後,最簡單的代碼的副本,它注意到它沒有達到end,這仍然不會觸發end事件。我可以看到正在讀取的data許多迭代/塊,但從不觸發文件和end的所有數據。

function readFile(file) { 
    const readStream = fs.createReadStream(file, { 
     fd: null, 
     flags: 'r', 
     encoding: 'utf-8', 
     allowVolatile: true, 
     highWaterMark: staticHighWaterMark, 
    }); 

    readStream.on('data', (chunk) => { 
     console.log('DATA chunk', chunk.length); 
    }); 

    readStream.on('end',() => { 
     console.log('END file'); 
    }); 
} 

這是如此簡單,我開始懷疑,如果這件事情與我的環境,但如果確定爲簡單的邏輯問題上面讀取流什麼,請讓我知道。

注意:如果我繼續增加highWaterMark選項,它會使文件更進一步,但仍不會達到文件的end。然而,這對於達到或不達到文件末尾應該沒有什麼差別,而是控制每個「塊」讀取的數據量。

+0

出於好奇。你想逐行閱讀嗎? –

+0

它不一定是這樣,但我想它可能是,今天由nodejs api支持。你認爲這能夠達到文件的「結尾」嗎? – user376327

+0

我只是建議你改用'readline'(https://nodejs.org/dist/latest-v6.x/docs/api/readline.html)。我很好奇你的問題。我會發佈一個代碼供你測試,好嗎? –

回答

0

你可以測試這個,看看是否可以讀取整個文件?

function readFileV2(file) { 
    const readStream = fs.createReadStream(file, { 
     fd: null, 
     flags: 'r', 
     encoding: 'utf-8', 
     allowVolatile: true, 
     highWaterMark: staticHighWaterMark, 
    }); 

    readStream.pipe(process.stdout); 
}