使用NodeJS流式传输大型静态文件

时间:2017-07-07 14:28:45

标签: node.js stream large-files node-streams nodejs-stream

我需要定期使用大量未格式化的只读文本文件,并检查每个文件中是否存在某些内容/单词。该文件由所有字母数字字符组成。但是,我甚至在读取这些大型静态文件之一的流的end时遇到了问题。

下面是我尝试在注意到它未到达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。但是,这对于到达或未到达文件的末尾应该没有区别,而是控制每个“块”读取的数据量。

1 个答案:

答案 0 :(得分:0)

您可以测试一下,看看是否可以读取整个文件?

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

    readStream.pipe(process.stdout);
}