Stream(流)
简介
Stream是一个抽象接口,所有的Stream都是EventEmitter的实例,Stream有四种类型:
- Readable 可读
- Writeable 可写
- Duplex 可读可写操作
- Transform 操作被写入数据、然后读出结果
常用事件
- data—有数据可读时触发
- end—没有数据可读时触发
- error—在接受或写入过程中发生错误
- finish—所有数据被写入到底层系统时触发
读/写数据
读取
实例
var fs = require("fs");
var data = '';
var rs = fs.createReadStream("E:/for_file/6.txt");
rs.setEncoding('UTF8');
rs.on('data',function (content) {
data += content;
});
rs.on('end',function () {
console.log(data);
});
rs.on('error',function (err) {
console.log(err.stack);
});
console.log("over");
运行结果:
var readerStream = fs.createReadStream('路径');
读取文件内容:
如果可读:data = data+content(读取到的文件内容);
如果无数据可读:输出data
写入
实例
var fs = require("fs");
var data = '一个人至少拥有一个梦想,有一个理由去坚强。心若没有栖息的地方,到哪里都是在流浪。';
var ws = fs.createWriteStream('E:/for_file/6.txt');
ws.write(data,'UTF8');//按照utf8编码写入数据
ws.end();//标记末尾
ws.on('finish',function () {
console.log("over");
});
ws.on('error',function (e) {
console.log(e.stack);
});
console.log("finish");
运行结果:
createWriteStream()按照路径创建一个文件
监听finish和error事件
管道流
- 首先执行 readbable.pipe(writable),将 readable 与 writable 对接上
- 当 readable 中有数据时,readable.emit('data'),将数据写入 writable
- 如果 writable.write(chunk) 返回 false,则进入 pause 模式,等待 drain 事件触发
- drain 事件全部触发后,再次进入 flow 模式,写入数据
- 不管数据写入完成或发生中断,最后都会调用 unpipe()
- unpipe() 调用 Readable.prototype.unpipe(),触发 dest 的 unpipe 事件,清理相关数据
实例
var fs = require("fs");
var rs = fs.createReadStream("E:/for_file/6.txt");
var ws = fs.createWriteStream("E:/for_file/7.txt");
rs.pipe(ws);
console.log("over");
运行结果:
链式流
连接readerStream和writeStream并进行操作
实例
var fs = require('fs');
var zlib = require('zlib');
fs.createReadStream('E:/for_file/6.txt')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('E:/for_file/7.txt.gz'));
console.log("ovre");
运行结果:
var fs = require("fs");
var zlib = require('zlib');
// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('E:/for_file/6.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('E:/for_file/7.txt'));
console.log("文件解压完成。");
运行结果: