Node.js - 流


什么是流?

流是允许您以连续方式从源读取数据或将数据写入目标的对象。在 Node.js 中,有四种类型的流 -

  • 可读- 用于读取操作的流。

  • 可写- 用于写入操作的流。

  • 双工- 可用于读取和写入操作的流。

  • 变换- 一种双工流,其中输出是根据输入计算的。

每种类型的 Stream 都是一个EventEmitter实例,并在不同的时间实例抛出多个事件。例如,一些常用的事件是 -

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

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

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

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

本教程提供对 Streams 上常用操作的基本了解。

从流中读取

创建一个名为 input.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 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 main.js

验证输出。

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

写入流

使用以下代码创建一个名为 main.js 的 js 文件 -

var fs = require("fs");
var data = 'Simply Easy Learning';

// 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");

现在运行 main.js 来查看结果 -

$ node main.js

验证输出。

Program Ended
Write completed.

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

Simply Easy Learning

通过管道传输流

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

使用以下代码创建一个名为 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.