如果您可以将最终数据放入数组中,那么您是否也可以将其放入字符串中并像建议的那样将其拆分?在任何情况下,如果您想一次处理一行文件,也可以尝试如下操作:
var fs = require('fs');
function readLines(input, func) {
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
while (index > -1) {
var line = remaining.substring(0, index);
remaining = remaining.substring(index + 1);
func(line);
index = remaining.indexOf('\n');
}
});
input.on('end', function() {
if (remaining.length > 0) {
func(remaining);
}
});
}
function func(data) {
console.log('Line: ' + data);
}
var input = fs.createReadStream('lines.txt');
readLines(input, func);
编辑:(回应phopkins的评论)我认为(至少在较新版本中)子字符串不会复制数据,而是创建一个特殊的SlicedString对象(从v8源代码的快速浏览中)。无论如何,这里有一个避免了上述子字符串的修改(在一个价值几兆字节的“所有工作和没有玩都使杰克成为一个沉闷的男孩”的文件中进行了测试):
function readLines(input, func) {
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
var last = 0;
while (index > -1) {
var line = remaining.substring(last, index);
last = index + 1;
func(line);
index = remaining.indexOf('\n', last);
}
remaining = remaining.substring(last);
});
input.on('end', function() {
if (remaining.length > 0) {
func(remaining);
}
});
}