stream模块
- stream流,可以处理文件读取写入、网络通信
stream的应用场景主要就是处理IO操作,而http请求和文件操作都属于IO操作- 可以把
stream流就像水龙头,数据就像水一样,可以按需流动,避免了一次性加载所有数据所带来的内存压力,提升了 IO 操作的性能,还减少了内存占用
可以这么理解,stream流就像水龙头一样,慢慢的流,可以控制打开和关闭
stream的特点
- 逐块处理:数据以小块形式逐步读取和处理。
- 低内存占用:无需一次性将整个数据加载到内存中
- 高性能:适用于处理大数据集或长时间运行的网络连接
- 控制流动:可以控制数据流动的速度、暂停和恢复
stream核心
-
流数据管道
pipe -
Buffer 在 Stream 流中的作用
- 在
stream流中,Buffer用于暂存和传输数据块 - 可以更高效的写入大数据,提高效率
- Buffer可以想象成成stream流的蓄水池
- Buffer是缓冲区,把流的数据放到缓冲区中
- 在
stream场景
- 文件操作:可以逐块读取和写入大文件
- 网络通信:处理长时间运行的 TCP/HTTP 连接
- 打包工具底层:打包工具和编译涉及到很多文件操作,离不开stream流
文件读取写入
- 读取文件流:
fs.createReadStream - 文件写入流:
fs.createWriteStream - 读取流数据(理解为开启水龙头)
- readableStream.resume()
- readableStream.on('data')
常用的事件有:
data、end、error、readable、close。这些事件通过on方法来监听并处理
const fs = require('fs')
const readableStream = fs.createReadStream('./package.json')
// 通过on方法来监听读取stream流数据
readableStream.on('data',(chunk)=>{
console.log('chunk',chunk);
})
网络通信
- 从浏览器向服务器请求一个非常大的文本文件, 如果直接读取文件内容在内存中,再返回给客户端,这个过程可能会比较慢的,通过流stream的形式,内容逐块的呈现,文件中的每一块数据都会源源不断的发生给客户端,这样客户端获取文件的响应速度就会快很多
- 通过
pipe管道来传输数据流,pipe 会自动监听 data数据 和 end 事件
const fs = require('fs')
const http = require('http')
http.createServer((req, res) => {
res.writeHeader(200, {'Context-Type': 'text/html'})
fs.createReadStream('./big.txt').pipe(res)
}).listen(5000)