用实例说明在Node.js中使用流进行文件处理的过程

152 阅读5分钟

构建现实生活中的应用程序往往需要程序能够与文件和文件系统进行交互,在NodeJS环境中构建一个应用程序也不例外。对于这种通过NodeJS与文件的数据交互,有流的概念的用法。NodeJS中的流并不是一个只有节点的概念,它最早是在基于UNIX的操作系统中实现的。

流是一种逐位读取文件并将小块数据传递给服务器的方式,而不是将文件作为一个整体读取,然后将信息作为一个大数据文件传递给服务器。这看起来不是什么大事,但实际上,这在服务器上节省了大量的时间。

NodeJS中的流

流在缓冲区的帮助下作为队列工作,缓冲区是一个小的临时空间,用来存储要传输的数据块。缓冲区作为队列工作,如果你想把大量的数据从一个点传输到另一个点,那么缓冲区就会加载一大块数据,并把它传递给服务器,然后等待服务器的回应,这样它就可以从队列中丢弃这块数据。在等待服务器响应的同时,它根据程序员或应用程序设置的缓冲区的大小加载更多的数据块。

这个从文件中获取数据块,将其加载到缓冲区,然后将数据块解析到应用程序/服务器的整个过程被称为。在NodeJS中,有三种不同类型的流

  • 只读流,称为可读流
  • 只写的流,称为可写流
  • 读和写的流被称为双工流

在NodeJS中通过流从文件中读取数据

要开始学习这个教程,你需要在终端使用命令。

npm init -y

这将为我们创建一个新的node项目,同时在我们的目录中创建package.json文件

要使用NodeJS从文件中读取一些数据,你将需要一个包含一些文本的文件。因此,创建一个新的文本文件,使用lorem ipsum生成器放置一些**"Lorem Ipsum "**文本。

复制这个文本,并把它放在文本文件中,然后保存该文本文件。

正如你所看到的,该文本文件的名称是**"myData.txt"。** 在同一目录下创建一个新的javascript文件,命名为**"streamDemo.js"**

为了创建一个读或写的流,我们需要使用**"fs "模块,它作为node环境的一个内置模块。要在你的程序中包含fs**模块,请使用以下几行代码。

var fs = require("fs");

接下来,我们需要使用下面这行代码从我们的文本文件(与streamDemo.js文件放在同一目录下)创建一个读取流。

var myReadStream = fs.createReadStream(__dirname + `/myData.txt`);

现在,我们可以使用这个变量**"myReadStream "**在它每次收到新的数据块时执行一项任务。使用下面几行代码,在每次我们的流收到新的数据块时,将数据块打印到控制台。

myReadStream.on("data", function (chunk) {

console.log("New chunk has been accepted by the program");

console.log(chunk);

});

要运行这个程序,在终端输入以下命令。

node streamDemo

你将在控制台看到以下输出:

正如你所看到的,我们能够接收并打印出我们文件中的数据,然而,我们在控制台中得到的数据与我们文件中的数据不一样。这是因为我们需要在读流中设置一个编码程序。改变,读取流的行数,使之与下面这行代码一致。

var myReadStream = fs.createReadStream(__dirname + `/myData.txt`, "UTF8");

正如你所看到的,我们已经将**"UTF8 "编码添加到我们的流中。现在,如果我们使用"node streamDemo "**命令重新运行,我们在终端得到以下结果。

就这样,我们从文件中读取了正确的数据,并将其打印到了控制台。

在NodeJS中通过流将数据写入文件

我们可以使用NodeJS中的写流将数据写入文件,这也是**"fs "模块所提供的。**我们将把上一节中收到的数据写到一个新的文件中,我们将把它写成writeInMe.txt。

为了将数据写入文件,我们将使用下面这行代码创建一个新的写流

var myWriteStream = fs.createWriteStream(__dirname + `/writeInMe.txt`, "UTF8");

你可以注意到,我们已经在写流中加入了**"UTF8 "编码。为了将我们从"myData "** 文本文件中收到的数据块写到新文件中,我们将使用以下代码。

myReadStream.on("data", function (chunk) {

console.log("New chunk has been accepted by the program");

myWriteStream.write(chunk);

console.log("Chunk written to the new text file");

});

通过使用命令来执行该程序:

node streamDemo

你将得到以下输出:

你可以在代码编辑器的资源管理器中看到,一个新的文本文件被自动创建,如果双击 "writeInMe " 文本文件,你会看到该文件中的以下数据。

所以,从上面的图片可以看出,我们能够使用Streams将数据写入文件。

结论

流被用来一个文件中逐位或以小块的方式加载数据应用程序中。我们可以通过使用包含在**fs(文件系统)**模块中的流来读取和写入数据。文件系统(fs)模块是NodeJS的一个内置模块。有三种不同类型的流,即:可读流、可写流和双工流。在这篇文章中,我们实现了一个简单的节点程序,允许我们在数据流和缓冲区的帮助下,从一个文件中读取数据并将其写入不同的文件中。