Node.js中流(stream)的使用方法示例


Posted in Javascript onJuly 16, 2017

前言

本文主要给大家介绍了关于Node.js 流(stream)的使用方法,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍:

流是基于事件的API,用于管理和处理数据,而且有不错的效率.借助事件和非阻塞I/O库,流模块允许在其可用的时候动态处理,在其不需要的时候释放掉.

使用流的好处

举一个读取文件的例子:

使用fs.readFileSync同步读取一个文件,程序会被阻塞,所有的数据都会被读取到内存中.

换用fs.readFile读取文件,程序不会被阻塞,但是所有的数据依旧会被一次性全部被读取到内存中.

当处理大文件压缩,归档,媒体文件和巨大的日志文件的时候,内存使用就成了问题,在这种情况下,流的优势就体现出来了.

流被设计为异步的方式.相比将剩余的文件数据一次性读进内存,还是值得读取一个缓冲区,期望的操作将会被执行,而且结果会被写到输出流.

Node.js中流(stream)的使用方法示例

流的分类

  • stream.Readable---用于在I/O上获取数据
  • stream.Writable---用于在输出的目标写入数据
  • stream.Duplex---一个可读可写的流,例如网络连接
  • stream.Transform---一个会以某种方式修改数据的双工流

创建一个可读流

方法一

var Stream = require('stream')
var readable = Stream.Readable();
var source = ['a', 'b', 'c'];
readable._read = function() {
 this.push(source.shift() || null);
}
readable.pipe(process.stdin);

方法二

var Readable = require('stream').Readable;

function MyStream(options) {
 Readable.call(this, options);
}

MyStream.prototype = Object.create(Readable.prototype, {
 constructor: { value: MyStream }
});

MyStream.prototype._read = function() {
 this.push("hello");
 this.push(null);
}

var streams = new MyStream();

streams.pipe(process.stdin);

方法三

var stream = require('stream');
var util = require('util');

function MyStream(options) {
 stream.Readable.call(this, options);
}

MyStream.prototype._read = function(size) {
 this.push('hello');
 this.push(null);
}

util.inherits(MyStream, stream.Readable);

var streams = new MyStream();

streams.pipe(process.stdout);

可读流的一些概念

可读流是 对提供数据的源头的抽象

可读流的实例

  • http responses,on the client
  • http requests, on the server
  • fs read stream
  • zlib streams
  • crypto streams
  • TCP sockets
  • child process stdout and stderr
  • process.stdin

可读流的模式

可读流有两种工作模式:flowing和paused.

在flowing模式下,可读流自动从系统底层读取数据,并通过EventEmitter接口的事件尽快将数据提供给应用.

可读流在创建的时候都是处在paused模式.

可读流可以在两种模式下切换.

处于paused模式可读流,可以通过下面三种途径切换到flowing模式:

  • 监听'data'事件.
  • 调用stream.resume()方法.
  • 调用stream.pipe()方法将数据发送到Writable

处于flowing模式可读流,可以通过下面两种途径切换到paused模式:

  • 如果不存在管道目标,可以通过调用stream.pause()方法实现
  • 如果存在管道目标,可以通过取消'data'事件监听,并调用stream.unpipe()方法移除所有管道来实现

可读流事件

可读流提供了以下事件:

  • 'close'事件,事件将在流或底层资源关闭后触发,但不是所有的流都会触发该事件.
  • 'data'事件,data事件将会在流将数据传递给消费者时触发.当流转换到flowing模式时会触发该事件.
  • 'end'事件,end事件只有在数据被完全消费后才会触发.
  • 'error'事件,error事件会在底层系统内部出错从而不能产生数据,或当流的实现试图传递错误数据时发生.
  • 'readble'事件,readable事件将在流中有数据可供读取时触发.

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
地址栏上的一段语句,改变页面的风格。(教程)
Apr 02 Javascript
利用javascript实现全部删或清空所选的操作
May 27 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
Jun 10 Javascript
JS辨别访问浏览器判断是android还是ios系统
Aug 19 Javascript
js实现的牛顿摆效果
Mar 31 Javascript
javascript获取本机操作系统类型的方法
Aug 13 Javascript
JavaScript encodeURI 和encodeURIComponent
Dec 04 Javascript
JavaScript 闭包详细介绍
Sep 28 Javascript
vue.js中指令Directives详解
Mar 20 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
Dec 19 Javascript
jQuery表单选择器用法详解
Aug 22 jQuery
JS检测浏览器开发者工具是否打开的方法详解
Oct 02 Javascript
js+html5实现半透明遮罩层弹框效果
Aug 24 #Javascript
Vue Spa切换页面时更改标题的实例代码
Jul 15 #Javascript
Vue应用部署到服务器的正确方式
Jul 15 #Javascript
js+html5实现侧滑页面效果
Jul 15 #Javascript
angular2 ng build部署后base文件路径问题详细解答
Jul 15 #Javascript
Angular2关于@angular/cli默认端口号配置的问题
Jul 15 #Javascript
js编写简单的计时器功能
Jul 15 #Javascript
You might like
PHP全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
初学JavaScript第二章
2008/09/30 Javascript
JavaScript让IE浏览器event对象符合W3C DOM标准
2009/11/24 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件。
2011/12/26 Javascript
Jquery中ajax方法data参数的用法小结
2014/02/12 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
2016/12/16 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
原生JS实现拖拽功能
2020/12/16 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
5款非常棒的Python工具
2018/01/05 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
python飞机大战pygame游戏背景设计详解
2019/12/17 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
社区党员先进事迹
2014/01/22 职场文书
代办委托书怎样写
2014/04/08 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
《卖火柴的小女孩》教学反思
2016/02/19 职场文书
小学二年级语文教学反思
2016/03/03 职场文书