NodeJS Stream流
流数据在网络通信中至关重要,nodeJS用Stream提供了一个抽象接口,node中有很多对象实现了这个接口,提供统一的操作体验
基本流类型
NodeJS中,Stream有四种类型:
- Readable-可读操作
- Writable-可写操作
- Duplex-可读写操作
- Transform - 操作被写入数据,然后读出结果
所有的嗯Stream对象都是EventEmitter对象的实例,常用事件有:
- data-当有数据可读时触发
- end-没有更多的数据可读时触发
- error-在接收和写入过程中发生错误时触发
- finish-所有数据已被写入到底层系统时触发
数据读取
var fs = require('fs')
var data = ''
// 创建可读流
var readerStream = fs.createReadStream('input.txt')
// 处理流事件
// 读取时
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('读取完毕')
数据写入
var fs = require('fs')
var data = '测试数据'
// 创建一个写入流
var writerStream = fs.createWriteStream('output.txt')
// 使用utf8格式写入数据
writerStream.write(data, "utf-8")
// 标记文件结尾,触发finish
writerStream.end()
// 处理流事件
writerStream.on('finish', function() {
console.log("写入完成");
});
writerStream.on('error', function(err){
console.log(err.stack);
});
管道流
管道流可以连接输入流和输出流,可以实现大文件(如大于内存)的复制
var fs = require('fs')
// 创建一个可读流
var readerStream = fs.createReadStream('1.png')
// 创建一个写入流
var writerStream = fs.createWriteStream('2.png')
// 管道连接流对象
readerStream.pipe(writerStream)
链式流
用于连续操作
/*compress.js*/
var fs = require('fs')
var zlib = require('zlib')
// 用gzip压缩input.txt
fs.createReadStream('input.txt')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('input.txt.gz'))
console.log('文件压缩完成')
/*decompress.js*/
var fs = require('fs')
var zlib = require('zlib')
// 用gzip解压input.txt.gz
fs.createReadStream('input.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('input2.txt'))
console.log('文件解压完成')