本文翻译自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); }此方法将文件的全部内容同步读取到内存中,然后通过换行符拆分其内容。 乍看起来,它看起来很完美,但是有两个问题:
1.它是阻塞的,这意味着它将阻塞程序的执行,直到将整个文件加载到内存中为止。2.如果文件很大(千兆字节或更多),将对内存消耗产生严重影响。 通过使用非阻塞版本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-readerline-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); });如果您喜欢阅读本文,则可能还喜欢以下文章:
Reading and Writing Files in Node.jsHow to check if a file exists in Node.js喜欢这篇文章吗? 在Twitter和LinkedIn上关注我。 您也可以订阅RSS Feed。
上次更新时间:2020年2月21日
Node.js
您可能还喜欢…
How to read and write JSON files in Node.jsMonitoring Your Node.js App with Scout APMHow to encrypt and decrypt data in Node.jsHow to edit an XML file with Node.jsHow to read input from the command line in Node.js