- 先举个例子,你要把大桶水从A搬到B,如果一次性搬过去,很累吧,而且容易出事故。
- 怎么办,接一个馆子,让水从A流到B
- 这样不仅容易实现而且好控制
- node的stream就是这个原理
- stream是一种数据传输手段,是端到端的信息交换方式,而且是有序的,是逐块读写的,这个块就是Buffer
- 不懂buffer的看我这篇文章
- 一文大白话讲清楚Node中的buffer
- stream的好处是,他不像传统程序那样,一次讲一个文件读入内存,而是逐块读取数据,处理内容,而不是将其全部保存在内存中。
- stream由三部分构成
- 源数据source
- 目的地dest
- 和运输管道pipe
- 跟我们上面讲的运水的事一毛一样。
- 他的基本语法是source.pipe(dest),就是源数据利用管道,传输到dest
2.1 可写流
- 可写入的数据流,就是往进去流。比如fs.createWriteStream,可以使用流将数据写入文件
2.2 可读流
- 可读取数据的流,就是往出去流,比如fs.createReadStream,可以从文件读取内容
2.3 双工流
- 既可读有可写的流,就是又能往进去流,同时也能往出去流,比如net。Sokect
2.4 转换流
- 可以在数据写入和读取时修改或转换数据的流。比如,在文件压缩站时,可以向文件写入压缩数据,并从文件中读取解压数据
3.应用场景
3.1 双工流babel
- 我们在babel时一遍输入ES6代码,一边导出ES5代码
3.2 文件操作
- 我们通过流数据实现两个文件的拷贝,test.txt内容’test.txt’,newtest.txt内容为空,把test内容通过流拷贝到newtest
const fs=require('fs')
const readStream=fs.createReadStream('test.txt')
const writeStream=fs.createWriteStream('newtest.txt')
readStream.pipe(writeStream)
readStream.on('end',()=>{console.log(fs.readFile('ewstest.txt','utf8'))
})
3.3 打包工具的实现