NodeJS Stream流

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('文件解压完成')
原文地址:https://www.cnblogs.com/fanghao/p/7813263.html