本文翻译自How to read a file line by line in Node.js
能够逐行读取文件为我们提供了一个读取大型文件的机会,而无需将它们完全加载到内存中。 它还允许我们仅查找相关信息,并在找到该信息后停止搜索。
我们已经讨论了如何在Java中逐行读取文件,让我们看一下Node.js逐行读取文件的方式。
在Node.js中逐行读取文件的最简单方法是使用本地fs模块
的fs.readFileSync()
方法:
const fs = require('fs');
try {
// read contents of the file
const data = fs.readFileSync('file.txt', 'UTF-8');
// split the contents by new line
const lines = data.split(/\r?\n/);
// print all lines
lines.forEach((line) => {
console.log(line);
});
} catch (err) {
console.error(err);
}
此方法将文件的全部内容同步读取到内存中,然后通过换行符拆分其内容。 乍看起来,它看起来很完美,但是有两个问题:
fs.readFile()
可以解决第一个问题,但是在生产环境中,您不需要执行将整个文件读入内存的操作。但是,如果您只想读取小文件,则可以正常工作。
Readline是另一个Node.js本机模块,是专门为此目的开发的-从任何readable stream中一次读取一行。 您甚至可以使用此模块从命令行读取输入数据。
这是您可以在代码中访问它的方式(无需安装):
const readline = require('readline');
由于readline
模块适用于可读流,因此我们必须首先使用fs模块创建流,如下所示:
const rl = readline.createInterface({
input: fs.createReadStream('file.txt'),
output: process.stdout,
terminal: false
});
现在,我们可以侦听rl
对象上的line
事件,该事件将在从流中读取新行时触发:
rl.on('line', (line) => {
console.log(line);
});
完整的代码如下所示:
const fs = require('fs');
const readline = require('readline');
const rl = readline.createInterface({
input: fs.createReadStream('file.txt'),
output: process.stdout,
terminal: false
});
rl.on('line', (line) => {
console.log(line);
});
line-reader是一个开源模块,用于在Node.js中逐行读取文件。 您可以通过在终端中运行以下命令将其添加到项目中:
$ npm i line-reader --save
如果使用的是yarn
,可以通过在终端中运行以下命令将其添加到项目中:
$ yarn add line-reader
line-reader
模块提供了eachLine()
方法,该方法读取给定文件的每一行。 它需要一个带有两个参数的回调函数:行内容和一个布尔值,指定读取的行是否为文件的最后一行。 这是一个例子:
const lineReader = require('line-reader');
lineReader.eachLine('file.txt', (line, last) => {
console.log(line);
});
使用此模块的另一个好处是,当某些情况变为真时,停止读取。 可以通过从回调函数返回false
来实现:
const lineReader = require('line-reader');
lineReader.eachLine('file.txt', (line) => {
console.log(line);
// stop if line contains `NEW`
if(line.includes('NEW')) {
// stop reading and close the file
return false;
}
});
linebyline是另一个开放源代码库,可用于在Node.js中逐行读取文件。
让我们将其添加到您的项目中:
$ npm i linebyline --save
这个包简单地在内部流本机readline
模块,读取和缓冲新行,为每行发出一个行事件:
const readline = require('linebyline');
// read all lines
rl = readline('file.txt');
// listen for `line` event
rl.on('line', (line, lineCount, byteCount) => {
console.log(line);
}).on('error', (err) => {
console.error(err);
});
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有