• Node.js Video Tutorials

Node.js - 流



什么是流?

流是数据的集合。但是,与数组或字符串不同,流对象中的所有数据不会一次性存储在内存中。相反,一次只将流中的单个数据块加载到内存中。这使得流更加高效。Node.js 应用非常适合开发数据流应用。

流的类型

Node.js 处理四种基本的流类型:

  • 可写流 - 可以写入数据的流。

  • 可读流 - 可以从中读取数据的流。

  • 双工流 - 既是可读流又是可写流的流。

  • 转换流 - 可以在写入和读取数据时修改或转换数据的双工流。

每种类型的流都是 EventEmitter 实例,并在不同的时间实例中触发多个事件。例如,一些常用的事件包括:

  • data - 当有数据可供读取时触发此事件。

  • end - 当没有更多数据可供读取时触发此事件。

  • error - 当接收或写入数据时发生任何错误时触发此事件。

  • finish - 当所有数据都已刷新到底层系统时触发此事件。

本章中的示例使用名为 input.text 的文件,其中包含以下数据。

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

可读流

文件对象充当一个流,可以从中以特定大小的块读取数据。在下面的示例中,我们从 fs 模块调用 createReadStream() 函数以从给定文件读取数据。可读流的 on 事件收集文件内容,直到触发 end 事件。

var fs = require("fs");
var data = '';

// Create a readable stream
var readerStream = fs.createReadStream('input.txt');

// Set the encoding to be utf8. 
readerStream.setEncoding('UTF8');

// Handle stream events --> data, end, and error
readerStream.on('data', function(chunk) {
   data += chunk;
});

readerStream.on('end',function() {
   console.log(data);
});

readerStream.on('error', function(err) {
   console.log(err.stack);
});

console.log("Program Ended");

将上述脚本保存为 main.js。运行上述 Node.js 应用。它将显示 input.text 文件的内容。

可写流

fs 模块中的 createWriteStream() 函数创建一个可写流对象。它的 write() 方法将数据存储在作为参数传递给 createWriteStream() 函数的文件中。

将以下代码保存为名为 main.js 的文件。

var fs = require("fs");
var data = `Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!`;

// Create a writable stream
var writerStream = fs.createWriteStream('output.txt');

// Write the data to stream with encoding to be utf8
writerStream.write(data,'UTF8');

// Mark the end of file
writerStream.end();

// Handle stream events --> finish, and error
writerStream.on('finish', function() {
   console.log("Write completed.");
});

writerStream.on('error', function(err){
   console.log(err.stack);
});

console.log("Program Ended");

现在打开在当前目录中创建的 output.txt 文件,以检查它是否包含给定的数据。

管道流

管道是一种机制,我们将其提供一个流的输出作为另一个流的输入。它通常用于从一个流获取数据并将该流的输出传递给另一个流。管道操作没有限制。现在我们将展示一个从一个文件读取并将其写入另一个文件的管道示例。

创建一个名为 main.js 的 js 文件,其中包含以下代码:

var fs = require("fs");

// Create a readable stream
var readerStream = fs.createReadStream('input.txt');

// Create a writable stream
var writerStream = fs.createWriteStream('output.txt');

// Pipe the read and write operations
// read input.txt and write data to output.txt
readerStream.pipe(writerStream);

console.log("Program Ended");

现在运行 main.js 以查看结果:

node main.js

验证输出。

Program Ended

打开在当前目录中创建的 output.txt 文件;它应该包含以下内容:

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

链接流

链接是一种将一个流的输出连接到另一个流并创建多个流操作链的机制。它通常与管道操作一起使用。现在我们将使用管道和链接首先压缩一个文件,然后解压缩同一个文件。

创建一个名为 main.js 的 js 文件,其中包含以下代码:

var fs = require("fs");
var zlib = require('zlib');

// Compress the file input.txt to input.txt.gz
fs.createReadStream('input.txt')
   .pipe(zlib.createGzip())
   .pipe(fs.createWriteStream('input.txt.gz'));
  
console.log("File Compressed.");

现在运行 main.js 以查看结果:

node main.js

验证输出。

File Compressed.

您会发现 input.txt 已被压缩,并在当前目录中创建了一个名为 input.txt.gz 的文件。现在让我们尝试使用以下代码解压缩同一个文件:

var fs = require("fs");
var zlib = require('zlib');

// Decompress the file input.txt.gz to input.txt
fs.createReadStream('input.txt.gz')
   .pipe(zlib.createGunzip())
   .pipe(fs.createWriteStream('input.txt'));
  
console.log("File Decompressed.");

现在运行 main.js 以查看结果:

node main.js

验证输出。

File Decompressed.
广告