nodejs同步逐行读取大文件?

nro*_*roe 9 javascript filesystems node.js mojibake

我有一个大文件(utf8).我知道fs.createReadStream可以创建流来读取大文件,但不能同步.所以我尝试使用fs.readSync,但读取文本就像打破了"??".

var fs = require('fs');
var util = require('util');
var textPath = __dirname + '/people-daily.txt';   
var fd = fs.openSync(textPath, "r");
var text = fs.readSync(fd, 4, 0, "utf8");
console.log(util.inspect(text, true, null));
Run Code Online (Sandbox Code Playgroud)

JB *_*ohn 11

对于大文件,readFileSync可能不方便,因为它将整个文件加载到内存中.一种不同的同步方法是迭代调用readSync,一次读取少量数据,并在它们到来时处理这些行.以下代码实现了这种方法,并从文件'test.txt'一次同步处理一行:

var fs = require('fs');
var filename = 'test.txt'

var fd = fs.openSync(filename, 'r');
var bufferSize = 1024;
var buffer = new Buffer(bufferSize);

var leftOver = '';
var read, line, idxStart, idx;
while ((read = fs.readSync(fd, buffer, 0, bufferSize, null)) !== 0) {
  leftOver += buffer.toString('utf8', 0, read);
  idxStart = 0
  while ((idx = leftOver.indexOf("\n", idxStart)) !== -1) {
    line = leftOver.substring(idxStart, idx);
    console.log("one line read: " + line);
    idxStart = idx + 1;
  }
  leftOver = leftOver.substring(idxStart);
}
Run Code Online (Sandbox Code Playgroud)


Div*_*pta 7

使用https://github.com/nacholibre/node-readlines

var lineByLine = require('n-readlines');
var liner = new lineByLine('./textFile.txt');

var line;
var lineNumber = 0;
while (line = liner.next()) {
    console.log('Line ' + lineNumber + ': ' + line.toString('ascii'));
    lineNumber++;
}

console.log('end of line reached');
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 3

使用readFileSync

fs.readFileSync(filename, [encoding]) fs.readFile 的同步版本。返回文件名的内容。

如果指定了编码,则此函数返回一个字符串。否则它返回一个缓冲区。

顺便说一句,由于您使用的是节点,所以我建议使用异步函数。

  • @Tom,nroe 可能希望能够接收这些行作为读取调用的返回值。[此博客文章](http://blog.jaeckel.com/2010/03/i-tried-to-find-example-on-using-node.html)中提供了一些实现此功能的代码(不是我的)。 (2认同)