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('文件解压完毕');
结果:
文件解压完毕