Node JS-逐行读取文件并带有缓冲输出

时间:2018-07-31 16:04:41

标签: javascript node.js

我已经苦苦挣扎了6天,只是为了找到可以为我提供给定大文件的缓冲输出的解决方案。该文件可以是文本,二进制等。

下面的代码仅提供了小文件的缓冲输出。提供大文件会使其崩溃。

var fs = require('fs')

var stream = fs.createReadStream('big-file')

stream.on('data', function (data) {
    console.log(data)
})

我也尝试使用'byline'库

var fs = require('fs')
var byline = require('byline')

var stream = fs.createReadStream('big-file')

var buffered_stream = byline.createStream(stream, { keepEmptyLines : true )

buffered_stream.on('data', function (data) {
    console.log(data)
})

它提供每行的缓冲输出,但由于扩展的ASCII字符是再见字符,因此字节已损坏。

如果有人可以,请帮助我。预先感谢。

3 个答案:

答案 0 :(得分:1)

您可以看到here流的默认highWatermark属性等效于最大文件大小16kb。这并不意味着您应该更改其大小,而是要连接缓冲区,如下所示:

const fs = require('fs');

var stream = fs.createReadStream(BIG_FILE);

let buffers = [];;
stream.on('data', (chunk) => {
    const buf = Buffer.from(chunk)
    buffers.push(chunk);
})

stream.on('end', () => {
    console.log(Buffer.concat(buffers));
})

答案 1 :(得分:0)

很有趣,但是第二分钟我发布了这个问题,我得到了答案。抱歉更新延迟。下面的代码输出指定文件每一行(大或小的)的缓冲区。

var fs = require('fs')
var lazy = require('lazy')

var readStream = fs.createReadStream('FILE')

new lazy(readStream)
    .lines
    .forEach(function(line) {
        console.log(line) // Buffer
    })

答案 2 :(得分:0)

您可以按照建议的readline使用内置的here模块。

此外,Node.js 10添加了对在可读流上进行异步迭代的支持。 但是异步迭代器尚不支持readline ref)。

来自Node docs的异步迭代者的示例:

const fs = require('fs');

async function print(readable) {
  readable.setEncoding('utf8');
  let data = '';
  for await (const k of readable) {
    data += k;
  }
  console.log(data);
}

print(fs.createReadStream('file')).catch(console.error);