ReadableStream 简单实现

本文探讨了如何实现ReadableStream的核心功能,包括创建可读流、处理不同读取长度的情况。通过实例展示了当读取长度小于、等于和大于水位线时的处理策略,并提供了关键代码实现。
摘要由CSDN通过智能技术生成

今天的文章需要提前了解一下 nodefs 模块的相关 api,不太熟悉的同学可以点这里

众所周知,node 中的 fs 模块功能大都与文件相关,比如可以通过 fs.createReadStream 创建文件可读流,通过fs.createWriteStream 创建文件可写流,还可以通过监听 opendataenderrorreadable 事件对数据进行操作。由于时间有限,今天我们先来实现一下 readable 事件功能。

开始之前,先简单介绍一下可读流函数 fs.createReadStream(path[, options]) 中各参数所代表的含义,如下所示:

  • path <string> | <Buffer> | <URL> 创建可读流的路径
  • options <string> | <Object> 可选参数
    • flags <string> 文件读写标识,默认为 r
    • encoding <string> 读取编码格式,默认为 null
    • fd <integer> 文件描述符,默认为 null
    • mode <integer> 文件操作权限,默认为 0o666
    • autoClose <boolean> 文件是否自动关闭,默认为 true
    • start <integer> 文件读取开始位置,默认为 0
    • end <integer> 文件读取结束位置,默认为 Infinity
    • highWaterMark <integer> 水位线,每次读取长度,默认为 64字节(64 * 1024)

一、创建可读流

首先我们需要实现一个可读流的类,不防定义为 ReadableStream,该类可以通过 on 函数进行事件监听,所以需要继承 nodeEventEmitter 类; 当监听 readable 函数时可读取到文件内容,由此得知在构造函数中除了需要定义上面的变量,还需要调用打开文件和第一次读取文件的功能。代码如下:

let fs = require('fs')
let EventEmitter = require('events')
class ReadableStream extends EventEmitter {
  constructor(path, options) {
    super()
    this.path = path
    this.flags = options.flags || 'r'
    this.encoding = options.encoding || null
    this.autoClose = options.autoClose || true
    this.highWaterMark = options.highWaterMark || 64 * 1024
    this.start = options.start || 0
    this.end = options.end || null
    this.mode = options.mode || 0o666

    // 是否正在读取文件
    this.reading = false
    // 当len=0时,触发readable事件
    this.emitReadable = false
    // 缓存中字节的长度
    this.len = 0
    // 缓存每次读取的内容,格式为[<Buffer />, <Buffer />, ...]
    this.arr = []
    // 文件读取的位置
    this.pos = this.start
    // 是否文件全部读取完
    this.finished = false
    // 打开文件
    this.open()
    // 判断用户是否监听了readable事件
    this.on('newListener', (type) => {
      if (type === 'readable') {
        // 第一次文件读取
        this.read()
      }
    })
  }
}
module.exports = ReadableStream
复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值