Nodejs stream流

作者: JX灬君 | 来源:发表于2021-10-25 13:09 被阅读0次
    • 管道流最经典的管道流图

      • 我们把文件比作装水的桶,而水就是文件里的内容,我们用一根管子(pipe)连接两个桶使得水从一个桶流入另一个桶,这样就慢慢的实现了大文件的复制过程。


        image.png
    • 什么是stream

      • 每个stream对象都是一个水桶,通过管道pipe流到dest目标里
      • stream是一个抽象接口,node中有很多对象实现了这个接口
      • 对http服务器发起请求的request对象就是一个stream流
    • 了解stream流能处理的问题,了解IO操作的性能瓶颈概念

      • IO包括'网络IO'和'文件IO'
      • 相比于CPU计算和内存读写,IO的突出特点就是:慢!
      • 在有限的硬件资源下提高IO的操作效率
      • stream流能提升IO的的操作效率的方法
    • stream基础实例(根据实际项目变通使用)

      • 标准输入输出
        process.stdin.pipe(process.stdout)
      • http的pipe管道
        const http = require('http')
        const server = http.createServer((req, res) => {
          if(req.method === 'POST') {
            req.pipe(res) // pipe管道
          }
        })
        server.listen(8000)
        
      • stream拷贝文件(拷贝效率高)
        var fs = require('fs')
        var path = require('path')
        // 两个文件名
        var fileName1 = path.resolve(__dirname, 'data.txt')
        var fileName2 = path.resolve(__dirname, 'databak.txt')
        // 读取文件的stream流
        var readStream = fs.createReadStream(fileName1)
        // 写入文件的stream流
        var writeStream = fs.createWriteStream(fileName2)
        // 通过拷贝,执行pipe
        readStream.pipe(writeStream)
        // 可以监听data,查看每一步操作的数据
        readStream.on('data', chunk => {
          console.log(chunk.toString());
        })
        // 数据读取完成,即拷贝完成
        readStream.on('end', function() {
          console.log('拷贝完成');
        })
        
      • stream读取文件
        const http = require('http')
        const path = require('path')
        const fs = require('fs')
        const server = http.createServer((req, res) => {
          if(req.method === 'GET') {
            var fileName = path.resolve(__dirname, 'data.txt')
            var stream = fs.createReadStream(fileName)
            stream.pipe(res) // 将res作为stream的dest
          }
        })
        server.listen(8000)
        

    相关文章

      网友评论

        本文标题:Nodejs stream流

        本文链接:https://www.haomeiwen.com/subject/bxijaltx.html