ReadableStream 简单实现

今天的文章需要提前了解一下 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
    评论
JS ReadableStream 是一个功能强大的 JavaScript 接口,用于处理流式数据。它是 Web Streams API 的一部分,目的是提供一种标准方法来读取连续产生的数据,例如来自网络、文件或其他来源的数据流。 通过使用 ReadableStream,我们可以轻松地处理异步数据流。它允许我们从数据源读取数据,而不需要一次性加载整个数据。这对于处理大型数据或实时数据非常有用。我们可以从一个源读取数据,并在数据到达时使用响应式的方式处理它。 ReadableStream 接口提供了几种方法来读取数据。其中,最重要的方法是 `getReader()`,它返回一个 ReadableStreamDefaultReader 对象,该对象允许我们逐个读取数据块。 除了提供逐块读取的功能,ReadableStream 还有其他一些重要的特性。例如,可以通过调用 `cancel()` 方法来关闭流并中止使用的资源。还可以使用 `pipeThrough()` 和 `pipeTo()` 方法将一个流连接到另一个流上,以便在流之间直接传输数据。 ReadableStream 还支持流的自动暂停和恢复。当我们消费数据流时,我们可以使用 `readable.pause()` 方法暂停数据流的读取,使用 `readable.resume()` 方法恢复读取。 总之,JS ReadableStream 提供了一种优雅的方式来处理流式数据。它使我们能够以响应式的方式处理数据,逐块读取数据,并在需要时暂停和恢复数据流。它是处理异步流式数据的有力工具,为开发人员提供了更多控制和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值