• Nodejs中的流


    Nodejs中的很多地方都用到了流,流是一个很常见的概念,一个http请求,控制台输入输出的形式都是流。流可以分为三种:

    1. 可读流
    2. 可写流
    3. 既能读又能写

    其中第三种流又可以分为全双工流Duplex和转换流Transform,另外,所有的流都是EventEmitter的实例,也就是有发送事件和处理事件的能力。

    可读流 Readable Stream

    可读流可以输出数据,常见的可读流有:

    • http请求和响应
    • 读文件
    • 压缩解压
    • 加密解密
    • tcp sockect
    • 进程输入

    可读流分为两种模式:流式的和非流式的,区别就是前者会尽快保证数据可用,而后者则是只有等到你主动调用stream.read()之后才可用。

    刚才说过,所有的流都是EventEmitter的实例,它本身也有一些内置的事件,ReadableStream有的事件包括:

    • readable: 流中的数据已经准备就绪
    • data: 有数据到来,对应flowing模式
    • end: 没有更多的数据了
    • close: 有关的资源如文件描述符被关闭时触发
    • error: 接收数据时发生错误

    另外还有一些方法接口:

    • read([size]): 主动的拉取一定的数据,如果没有数据,则返回null,如果size不传,则返回所有可用的数据。该方法只能在non-flowing模式下调用
    • setEncoding(encoding): 使用什么样的编码格式进行解析
    • pause(): 停止发送data事件,新来的数据会保留到内部的buffer中
    • resume(): 对应上个事件,恢复data事件的发送
    • pipe(destination, [option]): 从流中拉取数据,并写入到destination流中,因为返回的是destination流,因此可以使用链式操作;默认情况下,读取流关闭后写入流也被关闭
    • unpipe([destination]): 将pipe方法设定的写入规则移除掉,如果不传入destination,则移除所有的流
    • unshift(chunk): 可以想象为把吐出来的东西再吃进去,这里就是把读取出来的部分或全部内容再次放到可读流中
    • wrap(stream): 对老式的流进行包装

    可写流 Writable Stream

    同样的,可写流有事件和方法两部分,事件包括:

    • drain: 表明数据还没有写完,write方法调用返回false
    • finish: 所有的数据都写入完毕
    • pipe: 当一个读取流调用pipe方法指向当前写入流
    • unpipe: 当一个读取流调用unpipe方法将当前写入流撤销时
    • error: 写入出现错误时

    方法:

    • write(chunk,[encoding],[callback]): 写入数据,当数据必须要在内部被缓冲时,返回false
    • end([chunk],[encoding],[callback]): 写完之后就终止新的写入了

    可读写流

    Duplex: 全双工的流,可读可写

    Transform: 从input中读取流数据,进行处理后写入到output流中

  • 相关阅读:
    [中文] 以太坊(Ethereum )白皮书
    走近比特币:一个故事看懂“区块链”
    MAC下redis的安装和配置
    mysql查询优化
    mac上用VMWare虚拟机装Linux-Ubuntu
    rest-framework框架
    浅谈设计模式
    [BZOJ3786]星系探索(欧拉序+非旋treap)
    [SDOI2017]遗忘的集合(多项式ln+生成函数+莫比乌斯反演)
    [LuoguP4841]城市规划(多项式ln+生成函数)
  • 原文地址:https://www.cnblogs.com/cubika/p/4012088.html
Copyright © 2020-2023  润新知