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. c++11 实现RAII特性

    参考文章https://blog.csdn.net/pongba/article/details/7911997 什么是RAII 技术?(参见百度百科相关条目) RAII(Resource Acqui ...

  2. codeforces 848B Rooter's Song

    题目链接 正解:排序+模拟. 我们注意到两个点碰撞的必要条件,$pi+tj=pj+ti$,移项以后发现就是$pi-ti=pj-tj$,那么我们可以把$p-t$相同的点分为同一组. 然后我们还可以发现一 ...

  3. 关于js点击事件出现 xx is not defined at HTMLAnchorElement.onclick 的问题

    测试: html: <button onclick="abc();">点我点我!</button> js: function abc(){ alert(“1 ...

  4. C# .NET开发图形图像程序时提示"GDI+ 中发生一般性错误"

    今天突然收到一封信,说我那个极度复杂的Marshal的问题被解决了(http://www.cnblogs.com/hotcan/archive/2005/01/12/91007.html).顿时感觉好 ...

  5. 【UVA11806 Cheerleaders】 题解

    题目链接:https://www.luogu.org/problemnew/show/UVA11806 容斥原理+组合数 正着找合♂fa的不好找,那就用总方案数-不合♂fa的 #include < ...

  6. 移动端web开发技巧和常见问题

    常见问题 1.移动端如何定义字体font-family 三大手机系统的字体: ios 系统 默认中文字体是Heiti SC 默认英文字体是Helvetica 默认数字字体是HelveticaNeue ...

  7. Python:文件的读取、创建、追加、删除、清空

    一.用Python创建一个新文件,内容是从0到9的整数, 每个数字占一行:#python>>>f=open('f.txt','w')    # r只读,w可写,a追加>> ...

  8. Java添加事件的几种方式(转载了codebrother的文章)

    /** * Java事件监听处理——自身类实现ActionListener接口,作为事件监听器 * * @author codebrother */ class EventListener1 exte ...

  9. 解决MyEclipse JAVA EE无法识别Base64问题

    第一步:右击项目选择Build Path,选择Configure Build Path 第二步:点击JRE System Library选择右边的Edit 第三步:选择Alternate JRE,点击 ...

  10. App 运行后屏幕顶部和底部各留黑边问题 - iOS

    App 启动后屏幕的顶部和底部各产生一条黑边,App 的内容会被压缩在两个黑条内显示,比例失调的情况. 初步判断是启动页资源图片适配问题. 首先,查看工程 project => General ...