概述

流,值一个抽象的接口,在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); })

  1. <a name="56eb9b90"></a>
  2. ## 写入流
  3. ```javascript
  4. const fs = require('fs');
  5. const path = require('path')
  6. let data ='我是前端伪大叔,我是即将写入的内容'
  7. // 创建一个写入流
  8. let writeStream = fs.createWriteStream(path.join(__dirname,'path'));
  9. // 写入内容并且 设置编码格式
  10. writeStream.write(data,'utf-8')
  11. // 写入完成后需要调用结束
  12. writeStream.end()
  13. // 全部写法成功
  14. writeStream.on('finish',()=>{
  15. console.log(`全部写入完成${data}`);
  16. })

管道流

从一个流中获取数据,传递到另一个流中。

  1. // 管道流
  2. const fs = require('fs');
  3. const path = require('path')
  4. // 创建读取流
  5. let readStream = fs.createReadStream(path.join(__dirname,'fs.js'))
  6. // 创建写入流
  7. let writeStream = fs.createWriteStream(path.join(__dirname,'fs'))
  8. // 管道流操作 读取 => 写入
  9. readStream.pipe(writeStream);
  10. // 或者直接copy~~
  11. fs.copyFile(path.join(__dirname,'path.js'),path.join(__dirname,'path.txt'),(err)=>{
  12. console.log(err);
  13. if(!err) {
  14. console.log('copy ok');
  15. }
  16. })

链式流

从一个输出流中读取数据,创建多个流来操作这个输出流的机制。一般用来操作管道流。列如:压缩解压缩

  1. const fs = require('fs');
  2. const path = require('path')
  3. const zlib = require('zlib')
  4. // 压缩文件
  5. fs.createReadStream(path.join(__dirname,'path.txt'))
  6. .pipe(zlib.createGzip())
  7. .pipe(fs.createWriteStream('path.txt.gz'))
  8. 不能同时和压缩执行,又懒得写异步了 标记一下
  9. // // 解压缩文件
  10. fs.createReadStream(path.join(__dirname,'path.txt.gz'))
  11. .pipe(zlib.createGunzip())
  12. .pipe(fs.createWriteStream('path.text'))