92. Stream 流

Stream

前端精进(后端方向)-Node.js 全解

第一个Stream例子

const fs = require('fs' )
const stream = fs. createWriteStream(' ./big file.txt' )
for(let i=0; i<10000; i++){
stream. write(~这是第${i} 行内容我们需要很多很多内容
要不停地写文件啊啊啊啊啊啊回车\n )
stream.end() //别忘了关掉stream
console.log( ' done' )

分析

打开流,多次往里面塞内容,关闭流

看起来就是可以多次写嘛,没什么大不了的

最终我们得到一个128兆左右的文件

Stream-流

截屏2023-04-26 上午12.41.06

释义 stream 是水流,但默认没有水

stream.write可以让水流中有水(数据)

每次写的小数据叫做chunk(块)

产生数据的一段叫做source(源头)

得到数据的一段叫做sink(水池)

第二个例子

分析

用任务管理器看看Node.js 内存占用,大概130Mb

第三个例子

用Stream 改写第二个例子 // 请先引入 fs 和 http

分析

查看Node.js内存占用,基本不会高于30Mb

可以用curl来做这段测试,速度会快很多

文件stream和response stream通过管道相连

管道

截屏2023-04-26 上午1.20.11

释义

两个流可以用一个管道相连

stream1的末尾连接上stream2的开端

只要 stream1有数据,就会流到 stream2

常用代码

stream1.pipe(stream2)

链式操作 a.pipe(b).pipe(c)

//等价于

a.pipe(b)

b.pipe(c)

管道续

管道可以通过事件实现

Stream对象的原型链

s=fs.createReadStream(path)

那么它的对象层级为

自身属性(由fs.ReadStream 构造)

原型:stream.Readable.prototype

二级原型: stream.Stream.prototype

三级原型: events.EventEmitter.prototype

四级原型: Object.prototype

Stream 对象都继承了EventEmitter

支持的事件和方法

截屏2023-04-27 上午2.01.54

drain面试常考:某一次写完了

finish: 整个都写完了

cork/uncork: 强制把所有写入的数据都缓冲到内存中。

Stream分类 名称 特点 Readable 可读

Writable 可写

Duplex 可读可写(双向) 读和写不会有交叉

Transform 可读可写(变化) 自己写自己读,中间会有个转化器

截屏2023-04-27 上午2.27.12

Readable Stream

静止态 paused 和流动态 flowing

默认处于 paused 态

添加 data事件监听,它就变为 flowing态

删掉 data事件监听,它就变为 paused 态

pause()可以将它变为 paused

resume() 可以将它变为 flowing

Writable Stream

drain流干了事件

表示可以加点水了

我们调用 stream.write(chunk) 的时候,可能会得到false

false的意思是你写太快了,数据积压了

这个时候我们就不能再write了,要监听drain

等drain事件触发了,我们才能继续write

听不懂?看文档中的代码arrow-up-right就懂了

finish事件 调用 stream.end()之后,而且

缓冲区数据都已经传给底层系统之后,

触发finish事件

之前讲的内容, 都是在使用Stream, 怎么创建自己的流,给别人用?

创建一个Writable Stream

创建一个 Readable Stream

Duplex Stream

Transform Stream

内置的Transform Stream

续2

续3

压缩和加密

Stream用途非常广

在Node.js里随处可见 Node.js 中的 Steam

截屏2023-04-28 上午12.38.43

数据流中的积压问题

看这篇文章arrow-up-right

背压BackPressure

什么是背压?

往一个流里面写数据写的太多了,就会堵住,堵住了之后该如何把积压的流畅起来?(会用到cork)

参考 Node's Streams链接arrow-up-right,非常推荐阅读(如果英文好的话)

Node.js Stream文档

英文链接arrow-up-right

中文链接arrow-up-right

文档里面有你想要知道的所有细节

面试题

面试高级前端工程师必问之流-streamarrow-up-right

最后更新于