Node.js Stream(流)

Node.js Stream(流)

参考https://www.runoob.com/nodejs/nodejs-stream.html

  • Stream是一个抽象接口,很多类都实现了它,例如:
 1. 对http服务器发起请求的request对象;
 2. stdout(标准输出)。
  • 4种Stream类型:
  1. Readable:可读操作;
  2. Writable:可写操作;
  3. Duplex:可读写操作;
  4. Transform:操作被写入的数据,然后读出结果。
  • 所有的Stream对象都是EventEmitter的实例。常用的事件有:
 1. data:当有数据可读时触发;
 2. end:没有更多的数据可读时触发(类似于EOF);
 3. error:在接收和写入过程种发生错误时触发;
 4. finish:单次操作写入所有数据都已被写入完成时触发。

中读取数据

使用input.txt作为可读的文本文件,内容为:

  菜鸟教程官网地址:www.runoob.com

创建main.js文件,代码如下:

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

// 创建可读流
var readerStream = fs.createReadStream('input.txt');
// 设置编码为utf-8,可省略
readerStream.setEncoding('utf8');

// 处理流事件
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('程序执行完毕');

结果:

  程序执行完毕
  菜鸟教程官网地址:www.runoob.com

默认的读取编码为'utf8',可以省略。

写入流

var fs = require('fs');
var data = '菜鸟教程官网地址:www.runoob.com';

// 创建可写流
var writerStream = fs.createWriteStream('input.txt');
// 设置编码为utf-8并写入
// writerStream.write(data, 'utf8');
writerStream.write(data);
// 标记文件末尾
writerStream.end();

// 处理流事件
writerStream.on('finish', function(chunk){
	console.log('写入完成');
});
writerStream.on('error', function(err){
	console.log(err.stack);
});
console.log('程序执行完毕');

结果:

  程序执行完毕
  写入完成

默认的写入编码为'utf8',可以省略。

管道流

管道流提供了一个输出流到输入流的机制,用于流与流之间的数据传递。
src=>dest

var fs = require('fs');

// 创建可读流
var readerStream = fs.createReadStream('input.txt');
// 创建可写流
var writerStream = fs.createWriteStream('output.txt');

// 管道流操作,将readerStream中的数据流入到writerStream中
readerStream.pipe(writerStream);

console.log('程序执行完毕');

结果:

  程序执行完毕

查看output.txt中的内容:

  菜鸟教程官网地址:www.runoob.com

链式流

通过连接输出流到另外一个流并创建多个流操作链的机制,一般用于管道操作。

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('文件压缩完毕');

结果:

  文件压缩完毕

同时当前目录下生成了input.txt.gz的压缩文件。
尝试解压该文件:

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

// 解压input.txt.gz文件为input.txt
fs.createReadStream('input.txt.gz')
	.pipe(zlib.createGzip())
	.pipe(fs.createWriteStream('input.txt'));

console.log('文件解压完毕');

结果:

  文件解压完毕
posted @ 2020-12-26 14:21  pangqianjin  阅读(96)  评论(0编辑  收藏  举报