NodeJs 第三章 文件I/O、文件流

发布时间:2023年12月26日

文件I/O

I/O(input/output) 对外部设备的输入输出, IO的速度往往低于内存和CPU的交互速度

外部设备,例如

  • 磁盘
  • 网卡
  • 显卡
  • 打印机

fs模块

模块能够以标准 POSIX 函数为模型的方式与文件系统进行交互

  • fs.readFile(读取一个文件)
  • fs.writeFile(向文件写入内容)
  • fs.stat(获取文件或目录信息)
    • size: 占用字节
    • atime:上次访问时间
    • mtime:上次文件内容被修改时间
    • ctime:上次文件状态被修改时间
    • birthtime:文件创建时间
    • isDirectory():判断是否是目录
    • isFile():判断是否是文件
  • fs.readdir(获取目录中的文件和子目录)
  • fs.mkdir(创建目录)
  • fs.exists(判断文件或目录是否存在)
    • fs.exists 在 v1.0.0 版本弃用,官方推荐使用 fs.stat 和 fs.access

文件流

什么是流

是指数据的流动,数据从一个地方缓缓的流动到另一个地方
在这里插入图片描述
流是有方向的

  • 可读流: Readable(数据从源头流向内存)
  • 可写流: Writable(数据从内存流向源头)
  • 双工流:Duplex(数据即可从源头流向内存
    又可从内存流向源头)

为什么需要流

  1. 其他介质和内存的数据规模不一致
    在这里插入图片描述

  2. 其他介质和内存的数据处理能力不一致

在这里插入图片描述

文件流

什么是文件流

内存数据和磁盘文件数据之间的流动

如何创建文件流

  • fs.createReadStream(path[, options])

    • 创建一个文件可读流,用于读取文件内容
    • path:读取的文件路径
    • options:可选配置
      • encoding:编码方式
      • start:起始字节
      • end:结束字节
      • highWaterMark:每次读取数量
        • 如果encoding有值,该数量表示一个字符数
        • 如果encoding为null,该数量表示字节数
    • 返回:Readable的子类ReadStream
      • 事件:rs.on(事件名, 处理函数)
        • open(文件被打开后触发)
        • error(发生错误时触发)
        • close(文件被关闭后触发)
          • 可通过rs.close手动关闭或文件读取完成后自动关闭(autoClose配置项默认为true)
        • data(读取到一部分数据后触发)
          • 注册data事件后,才会真正开始读取
          • 每次读取highWaterMark指定的数量
          • 回调函数中会附带读取到的数据
            • 若指定了编码,则读取到的数据会自动按照编码转换为字符串
            • 若没有指定编码,读取到的数据是Buffer
        • end(所有数据读取完毕后触发)
      • rs.pause()
        • 暂停读取, 会触发pause事件
      • rs.resume()
        • 恢复读取,会触发resume事件
  • fs.createWriteStream(path[, options])

    • 创建一个写入流
    • path:写入的文件路径
    • options
      • flags:操作文件的方式
        • w:覆盖
        • a:追加
      • encoding:编码方式
      • start:起始字节
      • highWaterMark:每次最多写入的字节数
    • 返回:Writable的字类WriteStream
      • ws.on(事件名, 处理函数)
        • open
        • error
        • close
      • ws.write(data): 写入一组数据
        • data可以是字符串或Buffer

        • 返回一个boolean值

          • true:写入通道没有被填满,接下来的数据可以直接写入,无须排队
            在这里插入图片描述
          • false:写入通道目前已被填满,接下来的数据将进入写入队列
            在这里插入图片描述
            要特别注意背压问题,因为写入队列是内存中的数据,是有限的
        • 当写入队列清空时,会触发drain事件

      • ws.end([data])
        • 结束写入,将自动关闭文件
          • 是否自动关闭取决于autoClose配置(默认true)
        • data是可选的,表示关闭前的最后一次写入
  • rs.pipe(ws)

    • 将可读流连接到可写流
    • 该方法可解决背压问题
文章来源:https://blog.csdn.net/aXin_li/article/details/135225309
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。