Nodejs教程-Node.js流(Streams)
Nodejs教程-流是一种用于从源读取数据并写入目标的对象。在Node.js中有四种类型的流:
- 可读流(Readable):用于读取操作。
- 可写流(Writable):用于写入操作。
- 双工流(Duplex):可用于读取和写入操作。
- 转换流(Transform):是双工流的一种,其输出根据输入计算而得。
每种类型的流都是一个事件发射器实例,并在不同的时间点抛出多个事件。以下是一些常用的事件:
- data: 当有数据可供读取时触发此事件。
- end: 当没有更多的数据可供读取时触发此事件。
- error: 当接收或写入数据时发生错误时触发此事件。
- finish: 当所有数据都已刷新到底层系统时触发此事件。
Node.js读取流
创建一个名为input.txt的文本文件,其中包含以下内容:
Javatpoint is a one of the best online tutorial website to learn different technologies in a very easy and efficient manner.
创建一个名为main.js的JavaScript文件,其中包含以下代码:
var fs = require("fs");
var data = '';
// 创建一个可读流
var readerStream = fs.createReadStream('input.txt');
// 设置编码为utf8
readerStream.setEncoding('UTF8');
// 处理流事件 --> data, end, 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("程序执行完毕");
现在,打开Node.js命令提示符并运行main.js:
node main.js
输出:
Node.js写入流
创建一个名为main.js的JavaScript文件,其中包含以下代码:
var fs = require("fs");
var data = 'A Solution of all Technology';
// 创建一个可写流
var writerStream = fs.createWriteStream('output.txt');
// 使用utf8编码写入数据
writerStream.write(data, 'UTF8');
// 标记文件末尾
writerStream.end();
// 处理流事件 --> finish, error
writerStream.on('finish', function() {
console.log("写入完成。");
});
writerStream.on('error', function(err){
console.log(err.stack);
});
console.log("程序执行完毕");
现在,打开Node.js命令提示符并运行main.js:
node main.js
你将看到以下结果:
现在,你会发现在保存了"input.txt"和"main.js"文件的位置创建了一个名为"output.txt"的文本文件。在我的例子中,它在桌面上。
打开"output.txt",你将看到以下内容。
Node.js流的管道(Piping Streams)
管道是一种机制,其中一个流的输出被用作另一个流的输入。在管道操作中没有限制。
我们来看一个读取一个文件并将其写入另一个文件的管道示例。
File: main.js
var fs = require("fs");
// 创建一个可读流
var readerStream = fs.createReadStream('input.txt');
// 创建一个可写流
var writerStream = fs.createWriteStream('output.txt');
// 管道读写操作
// 从input.txt读取数据并写入output.txt
readerStream.pipe(writerStream);
console.log("程序执行完毕");
打开Node.js,并运行main.js:
node main.js
现在,你会发现在当前文件夹中创建了一个名为"output.txt"的文本文件,其中包含"input.txt"的内容。
打开"output.txt",你将看到以下内容。
Node.js流的链式操作(Chaining Streams)
链式操作是一种通过将一个流的输出连接到另一个流来创建多个流操作的机制。它通常与管道操作一起使用。
我们来看一个使用链式操作来压缩文件并随后解压相同文件的例子。
File: main.js
var fs = require("fs");
var zlib = require('zlib');
// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('input.txt')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('input.txt.gz'));
console.log("文件压缩完成。");
在Node.js命令提示符中运行main.js:
node main.js
你将得到以下结果:
现在,你将看到在当前文件夹中创建了一个名为"input.txt"的压缩文件,名为"input.txt.gz"。
解压相同文件: 将以下代码放入"main.js"中:
File: main.js
var fs = require("fs");
var zlib = require('zlib');
// 解压 input.txt.gz 文件为 input.txt
fs.createReadStream('input.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('input.txt'));
console.log("文件解压完成。");
在Node.js命令提示符中运行main.js:
node main.js