概述
流,值一个抽象的接口,在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>## 写入流```javascriptconst 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'))
