在计算机科学中,文件是一种资源,用于在计算机的存储设备中离散地记录数据。Node.js不会以任何方式覆盖它,并且可以与文件系统中被视为文件的任何文件一起使用。
读取文件和资源有许多用途:
有时,这些文件可能非常大,存储了千兆字节或TB级的文件,而整个文件的读取效率很低。
能够逐行读取文件使我们能够仅查找相关信息,并在找到所需内容后停止搜索。它还使我们可以将数据分解为逻辑片段,就像文件是CSV格式一样。
Node.js具有本机模块来读取文件,从而使我们可以逐行读取文件。它是在2015年添加的,旨在Readable
一次从任何流中读取一行。
这个事实使它成为通用的选项,不仅适用于文件,甚至适用于诸如的命令行输入process.stdin
。有关readline
模块的文档可在此处找到。
和readline
本机模块一样。您不必使用npm
任何其他软件包管理器来添加它,只需require
:
const readline = require('readline');
你很高兴去!
由于该readline
方法应随流一起提供,因此我们必须首先使用另一个本机模块-来创建它fs
:
const fs = require('fs');
下一步是使用以下createInterface()
函数创建将从流中读取的对象:
const readInterface = readline.createInterface({
input: fs.createReadStream('/path/to/file'),
output: process.stdout,
console: false
});
确保/path/to/file
用文件系统中文件的实际路径替换。
准备工作完成后,可以通过以下方式逐行读取文件并将其内容打印到控制台:
readInterface.on('line', function(line) {
console.log(line);
});
在这里,我们实质上是说,只要line
事件发生在中,readInterface
就应该调用我们的函数并将从流中读取的内容传递给它。在我们的情况下,我们不想使事情复杂化,而只是将其打印到控制台上。
在详细说明了如何使用本机Node.js模块逐行读取文件之后,让我们使用npm 的开源行读取器模块来查看它的较短版本。
由于它是一个非本地模块,因此我们需要确保已使用正确的方式初始化了npm项目npm init
,然后进行安装:
$ npm install --save line-reader
这将安装依赖项并将其添加到package.json
文件中。
完成后,逐行读取文件仅与前面的示例相似,而无需readInterface
在中间创建文件:
const lineReader = require('line-reader');
lineReader.eachLine('/path/to/file', function(line) {
console.log(line);
});
这里一个非常有用的功能是在某些情况变为真时停止读取。这可以通过简单地false
从回调函数返回来实现。
例如,我们可以逐行读取文件,直到找到其中包含单词“ STOP”的行:
lineReader.eachLine('path/to/file', function(line) {
console.log(line);
if (line.includes('STOP') {
return false; // stop reading
}
});
有一种稍微不同的方法,它使用两个嵌套的回调和语法,对于那里的Java开发人员来说似乎更自然:
lineReader.open('/path/to/file', function(reader) {
if (reader.hasNextLine()) {
reader.nextLine(function(line) {
console.log(line);
});
}
});
在这里,我们正在使用该open()
函数,它不会立即为我们提供文件中的行,而是为我们提供了reader
。它有自己的一组功能,例如hasNextLine()
和nextLine()
,这些功能使我们可以对Node.js中逐行读取文件的过程进行更多控制。
npm模块提供了不同的语法n-readlines
:
让我们安装它:
$ npm install --save n-readlines
并要求它:
const lineByLine = require('n-readlines');
为了能够读取文件,我们应该创建一个新对象,并提供一个指向文件的路径作为参数:
const liner = new lineByLine('/path/to/file');
通过调用以下next
函数从文件中获取行:
let line;
while (line = liner.next()) {
console.log(line);
}
该n-readlines
模块的一个有趣功能是reset()
。它会重置指针并从文件的最开始开始读取过程。
注意:仅在未达到结尾时才起作用。
在Node.js中逐行读取文件时,常见的错误是将整个文件读取到内存中,然后通过换行符分割其内容。
这是一个不正确的示例,如果提供足够大的文件,可能会使系统过载:
require('fs').readFileSync('/path/to/file', 'utf-8').split(/\r?\n/).forEach(function(line) {
console.log(line);
});
乍一看,这种方法的输出与以前的方法看起来是相同的,实际上,对于小文件来说,它的工作效果很好。但是,请继续尝试与大公司合作。绝对不是您想在生产系统中看到的东西。
在Node.js中有多种方式逐行读取文件,选择适当的方法完全是程序员的决定。
您应该考虑计划要处理的文件的大小,性能要求,代码样式以及项目中已经存在的模块。确保在一些极端情况下进行测试,例如巨大,空白或不存在的文件,并且最好使用提供的任何示例。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。