跳到主要内容

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 方法来监听并处理

js
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 事件
js
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)