当前位置 : 主页 > 网络编程 > JavaScript >

node 可读流与可写流的运用详解

来源:互联网 收集:自由互联 发布时间:2023-02-08
目录 先谈aip 创建一个可读流 使用可读流读取数据 三个十分关键的方法 一些不太常用的监听 监听书写的注意事项 使用可写流写入数据 什么是写入缓存? 使用可读流与可写流处理文件
目录
  • 先谈aip
  • 创建一个可读流
  • 使用可读流读取数据
    • 三个十分关键的方法
    • 一些不太常用的监听
    • 监听书写的注意事项
  • 使用可写流写入数据
    • 什么是写入缓存?
  • 使用可读流与可写流处理文件
    • koa框架文件上传

      先谈aip

      fs文件系统模块,是node.js的一个文件操作模块,这篇文章将演示如何使用它进行流式文件操作

      创建一个可读流

      const rs =  fs.createReadStream("./1.txt",config)//参1文件路径,参2配置对象
      

      配置对象举例

      //一般都是直接默认
      const config = {
          encoding:"utf-8",//编码格式
          highWaterMark:3,//每次读取几字节,汉字占三字节
          autoClose:true,//自动关闭
          start:0//从何处开始读
          flawing:false//创建时暂停读取
          flags:'r'//如何读取
      }
      

      flags配置项选项:

      flags值功能r以读取模式打开文件。如果文件不存在抛出异常。r+以读写模式打开文件。如果文件不存在抛出异常。rs以同步的方式读取文件。rs+以同步的方式读取和写入文件。w以写入模式打开文件,如果文件不存在则创建。wx类似 'w',但是如果文件路径存在,则文件写入失败。w+以读写模式打开文件,如果文件不存在则创建。wx+类似 'w+', 但是如果文件路径存在,则文件读写失败。a以追加模式打开文件,如果文件不存在则创建。ax类似 'a', 但是如果文件路径存在,则文件追加失败。a+以读取追加模式打开文件,如果文件不存在则创建。ax+类似 'a+', 但是如果文件路径存在,则文件读取追加失败。

      使用可读流读取数据

      可读流是一种流式的,持续的读取,所以给我们的数据也是持续的,我们需要不断的来接收它

      我们假设1.txt里面存储了: 123456789

      const rs =  fs.createReadStream("./1.txt",{highWaterMark:1})//每次读取1字节
      /**用来保存可读流读取的数据 */
      const arr =[];
      rs.on("data", (val) => {
          console.log(val);//这个函数会触发九次
          arr.push(val)//将val添加到数组末尾
      });
      //监听end方法,可读流读取完毕时该方法调用
      rs.on("end",()=>{
          console.log(arr)
      })
      //监听错误
      rs.on("error", (err: Error) => {
          console.log(err);
      });
      

      三个十分关键的方法

      除了这两个事件,它还有三个十分关键的方法

      rs.on("data", (val: string) => {
          console.log(val);
          rs.pause()//暂停读取
          rs.resume() //继续读取
      });
      rs.pipe(我是可写流!下面会说!)//将读取的文件直接放入写入的文件中
      

      一些不太常用的监听

      rs.on("open", () => {
          console.log("打开了");
        });
      rs.on("close", () => {
          console.log("关闭了");
      });
      

      监听书写的注意事项

      const arr = [];
      rs.on("data", (val) => {
          console.log(val);//这个函数会触发九次 
          arr.push(val)//将val添加到数组末尾
          rs.on("end",()=>{
              // !!! 注意 这样书写监听监听并不会按照我们的预期执行
              console.log(arr);
          })
      });
      

      使用可写流写入数据

      //创建可写流
      const ws = fs.createWriteStream("./2.text",config)
      //使用可写流
      ws.write('1')//写入,当缓存区满时会返回false,反之true
      ws.close()//关闭可写流
      ws.end("写完我后并关闭可写流")
      //侦听可写流
      ws.on('poen',()=>{console.log('可写流打开了')})
      ws.on('close',()=>{console.log('可写流关闭了')})
      ws.on("drain",()=>{console.log("写入缓存空了,可以继续写入")})//重要
      

      什么是写入缓存?

      我们调用ws.write()没有执行完毕时是不能执行下一个ws.write()的,操作所生成的数据被以链表的形式储存在缓存中.链表的形式可以保证写入的顺序是正确的.

      简单点说就是可写流忙不过来了,就搞个内存把任务装起来,有空再去写入

      使用可读流与可写流处理文件

      这个小dome会以64k为分隔,将1.txt的内容拷贝到2.txt里面,这样的可读可写流在客户端传大文件给服务器时尤为重要!

      //创建可读流
      const rs = fs.createReadStream("./1.txt")
      //创建可写流
      const ws = fs.createWriteStream("./2.txt")
      //监听data方法,可读流每次读取会调用
      rs.on("data", val => { 
          if(!ws.write(val+"64k分隔\n")){//\n是回车,\t是进格...
              //如果缓存满了会进此这个代码块
              rs.pause()//暂停读取
          }
      });
      //监听可写流的drain方法,写入缓存空了会调用此方法
      ws.on("drain",()=>{
          rs.resume() //继续读取
      })
      //监听end方法,可读流读取完毕时该方法调用
      rs.on("end",()=>{ 
          console.log("读取完毕")
          //记得关闭可写流!!!
          ws.close()
      })
      //监听错误 
      rs.on("error", err =>  console.log(err));
      

      如果仅仅只是使用流复制一份文件

      //创建可读流 
      const rs = fs.createReadStream("./1.txt") 
      //创建可写流
      const ws = fs.createWriteStream("./2.txt")
      rs.pipe(ws)//这就搞定了!,非常方便...
      

      koa框架文件上传

      # 安装koa-body
      npm i koa-body
      
      cosnt koaBody = require('koa-body')
      app.use(koaBody({
        multipart: true,//接收文件开关
        formidable: {
              maxFileSize: 1 * 1024 * 1024//最大上传1M
          }
      }));
      //收到文件后文件常用信息
      const file = ctx.request.files.img //img是前端上传文件时文件对应的key名
      file.size //文件大小
      file.filepath//文件缓存路径
      file.originalFilename//文件原名称
      file.mimetype//文件类型
      file.lastModifiedDate//文件上传时间
      file.newFilename//文件新名称
      file._writeStream//文件可写流,这个没啥用...
      //如果有多个文件,file将会是一个数组
      //可以使用文件的 file.filepath 缓存路径来创建一个可读流,然后保存到服务器或者数据库或者第三方平台
      

      以上就是node 可读流与可写流的运用详解的详细内容,更多关于node 可读流可写流的资料请关注易盾网络其它相关文章!

      上一篇:Vite+React搭建开发构建环境实践记录
      下一篇:没有了
      网友评论