Node 中的 Stream
流(Stream),是⼀个数据传输⼿段,是端到端信息交换的⼀种⽅式,⽽且是有顺序的,是逐块读取数
据、处理内容,⽤于顺序读取输⼊或写⼊输出
Node.js 中很多对象都实现了流,总之它是会冒数据(以 Buffer 为单位)它的独特之处在于,它不像传统的程序那样⼀次将⼀个⽂件读⼊内存,⽽是逐块读取数据、处理其内
容,⽽不是将其全部保存在内存中
流可以分成三部分: source 、 dest 、 pipe
在 source 和 dest 之间有⼀个连接的管道 pipe ,它的基本语法是 source.pipe(dest) ,
source 和 dest 就是通过pipe连接,让数据从 source 流向了 dest
在 NodeJS ,⼏乎所有的地⽅都使⽤到了流的概念,分成四个种类:
•
可写流:可写⼊数据的流。例如 fs.createWriteStream() 可以使⽤流将数据写⼊⽂件
•
可读流: 可读取数据的流。例如fs.createReadStream() 可以从⽂件读取内容
•
双⼯流: 既可读⼜可写的流。例如 net.Socket
•
转换流: 可以在数据写⼊和读取时修改或转换数据的流。例如,在⽂件压缩操作中,可以向⽂件写
⼊压缩数据,并从⽂件中读取解压数据
在 NodeJS 中 HTTP 服务器模块中, request 是可读流, response 是可写流。还有 fs 模
块,能同时处理可读和可写⽂件流
可读流和可写流都是单向的,⽐较容易理解,⽽另外两个是双向的
stream 的应⽤场景主要就是处理 IO 操作,⽽ http 请求和⽂件操作都属于 IO 操作
试想⼀下,如果⼀次 IO 操作过⼤,硬件的开销就过⼤,⽽将此次⼤的 IO 操作进⾏分段操作,让数
据像⽔管⼀样流动,直到流动完成
常⻅的场景有:
•
get请求返回⽂件给客⼾端
1 | const server = http.createServer(function (req, res) { |
•
⽂件操作
•
⼀些打包⼯具的底层操作



