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流中

Nodejs中的流的更多相关文章

  1. 理解nodejs中的stream(流)

    阅读目录 一:nodeJS中的stream(流)的概念及作用? 二:fs.createReadStream() 可读流 三:fs.createWriteStream() 可写流 回到顶部 一:node ...

  2. nodejs中Stream的理解

    在nodejs中可以通过fs模块读写文件,我们来看下fs模块提供的接口: fs.readFile(filename, callback) 异步读取文件. filename是读取文件的文件名,如果是相对 ...

  3. nodeJS中读写文件方法的区别

    导言:nodejs中所有与文件相关的操作都在fs模块中,而读写操作又是我们会经常用到的操作,nodejs的fs模块针对读操作为我们提供了readFile,read, createReadStream三 ...

  4. nodejs中mysql用法

    nodejs也算是一篇脚本了我们来看nodejs如何使用mysql数据库了有了它们两组合感觉还是非常的不错哦,下面一起来看nodejs中使用mysql数据库的示例,希望能够帮助到各位. <scr ...

  5. nodejs中如何使用mysql数据库[node-mysql翻译]

    nodejs中如何使用mysql数据库 db-mysql因为node-waf: not found已经不能使用,可以使用mysql代替. 本文主要是[node-mysql]: https://www. ...

  6. nodejs基础 -- Stream流

    nodejs 的 Stream 是一个抽象接口,node中有很多对象实现了这个接口.例如,对http服务器发起请求的request对象就是一个Stream,还有stdout(标准输出)也是一个Stre ...

  7. nodeJS中的事件机制

    events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如http.fs等.本文将详细介绍nodeJS中的事件机制 EventEmitter 多数 Node.js ...

  8. nodejs中的文件系统

    . 目录 简介 nodejs中的文件系统模块 Promise版本的fs 文件描述符 fs.stat文件状态信息 fs的文件读写 fs的文件夹操作 path操作 简介 nodejs使用了异步IO来提升服 ...

  9. 在nodejs中创建child process

    目录 简介 child process 异步创建进程 同步创建进程 在nodejs中创建child process 简介 nodejs的main event loop是单线程的,nodejs本身也维护 ...

随机推荐

  1. 分布式链路跟踪系统架构SkyWalking和zipkin和pinpoint

    Net和Java基于zipkin的全链路追踪 https://www.cnblogs.com/zhangs1986/p/8966051.html 在各大厂分布式链路跟踪系统架构对比 中已经介绍了几大框 ...

  2. 使用C#检验.NET FrameWork版本

    代码如下: public static bool checkFrameWork(string destVersion) { bool ver1 = GetVersionFromRegistry(des ...

  3. servlet-api-2.5.jar - jar not loaded

    由于包重复,把发布后的项目中的servlet-api-2.5.jar删除,不要clean项目,直接重新启动server即可.由于优先使用项目中的包,而实际使用需要tomcat中的包导致,直入页面会报o ...

  4. BIND简易教程(2):BIND视图配置

    目录:BIND简易教程(1):安装及基本配置BIND简易教程(2):BIND视图配置(本篇)BIND简易教程(3):DNSSec配置 上文书说到,我们把aaa.apple.tree解析到192.168 ...

  5. wampserver的安装与配置

    一.安装:wamp的安装很简单,只需要按照提示并根据自己的需求操作即可,这里不再赘述. 二.配置:wamp安装完后,需进行如下配置才能正常工作. 1.修改MySQL的登录密码 (1)启动WampSer ...

  6. vue通过watch对input做字数限定

    <div id="app"> <input type="text" v-model="items.text" ref=&q ...

  7. Linux学习总结(九)-源码包和rpm包安装

    一.源码包安装 通常办法是安装三部曲:./configuremakemake install但是具体还要根据包里面的帮助文档操作./configure --help 可以查看可以带什么参数,比如--p ...

  8. Multiply Strings 字符串相乘

    http://www.cnblogs.com/TenosDoIt/p/3735309.html https://blog.csdn.net/fly_yr/article/details/4805561 ...

  9. Java语言实现简单的登陆注册

    1.登录注册 1.1数据库设计 create table USER_INFO( id number not null, name ) not null, pass ) )insert into USE ...

  10. labview

    1.labview适用于测试测量领域,用于快速构建PC端上位机程序 2.例子: 我的电气参数测试仪. 上位机软件比想象的做的快了十几天... 学校的创新基金可以交差了,界面还是个人比较满意了.. 上图 ...