概述
流,值一个抽象的接口,在node中,很多方法、对象它们都实现了这个接口。列如:创建一个服务,向服务发送一个请求request对象,就是一个Stream
四中流类型
- Readable:可读操作
- Writable:可写操作
- Duple:可读操作
- Transform:操作被写入数据,然后读出结果
所有的Stream对象都是一个 EventEmitter
的实例,常用事件有
- data:有数据可读取时候触发
- end:没有更多数据时候触发
- error:接受写入过程中发生错误时候触发
- finish:所有数据被写入时候触发
读取流
```javascript const fs = require(‘fs’); const path = require(‘path’) let data = “”; // 创建一个可读流 let createStream = fs.createReadStream(path.join(__dirname,’fs.js’));
// 设置可读流的文件编码格式 createStream.setEncoding(‘utf-8’)
// 处理流事件 createStream.on(‘data’,(result)=>{ data += result })
// 结束 createStream.on(‘end’,()=>{ console.log(data); })
<a name="56eb9b90"></a>
## 写入流
```javascript
const fs = require('fs');
const path = require('path')
let data ='我是前端伪大叔,我是即将写入的内容'
// 创建一个写入流
let writeStream = fs.createWriteStream(path.join(__dirname,'path'));
// 写入内容并且 设置编码格式
writeStream.write(data,'utf-8')
// 写入完成后需要调用结束
writeStream.end()
// 全部写法成功
writeStream.on('finish',()=>{
console.log(`全部写入完成${data}`);
})
管道流
从一个流中获取数据,传递到另一个流中。
// 管道流
const fs = require('fs');
const path = require('path')
// 创建读取流
let readStream = fs.createReadStream(path.join(__dirname,'fs.js'))
// 创建写入流
let writeStream = fs.createWriteStream(path.join(__dirname,'fs'))
// 管道流操作 读取 => 写入
readStream.pipe(writeStream);
// 或者直接copy~~
fs.copyFile(path.join(__dirname,'path.js'),path.join(__dirname,'path.txt'),(err)=>{
console.log(err);
if(!err) {
console.log('copy ok');
}
})
链式流
从一个输出流中读取数据,创建多个流来操作这个输出流的机制。一般用来操作管道流。列如:压缩解压缩
const fs = require('fs');
const path = require('path')
const zlib = require('zlib')
// 压缩文件
fs.createReadStream(path.join(__dirname,'path.txt'))
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('path.txt.gz'))
不能同时和压缩执行,又懒得写异步了 标记一下
// // 解压缩文件
fs.createReadStream(path.join(__dirname,'path.txt.gz'))
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('path.text'))