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 相关文章推荐
Ajax一统天下之Dojo整合篇
Mar 24 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
Jan 12 Javascript
JavaScript 变量作用域分析
Jul 04 Javascript
页面回到顶部的三种实现(锚标记,js)
Oct 01 Javascript
Javascript对象Clone实例分析
Jun 09 Javascript
jQuery中text() val()和html()的区别实例详解
Jun 28 Javascript
canvas时钟效果
Feb 16 Javascript
浅谈 vue 中的 watcher
Dec 04 Javascript
解决LayUI表单获取不到data的问题
Aug 20 Javascript
浅谈Webpack核心模块tapable解析
Sep 11 Javascript
如何给element添加一个抽屉组件的方法步骤
Jul 14 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
PHP中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
jquery插件之easing使用
2010/08/19 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
JavaScript实现一个空中避难的小游戏
2017/06/06 Javascript
weex slider实现滑动底部导航功能
2017/08/28 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
Python备份Mysql脚本
2008/08/11 Python
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
python中lambda与def用法对比实例分析
2015/04/30 Python
python获取指定路径下所有指定后缀文件的方法
2015/05/26 Python
Python三级菜单的实例
2017/09/13 Python
用python实现百度翻译的示例代码
2018/03/09 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
免费获得微软MCSD证书赶快行动吧!
2012/11/13 HTML / CSS
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
广场舞大赛策划方案
2014/05/31 职场文书
领导党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
解除租房协议书
2014/12/03 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
宿舍管理制度范本
2015/08/07 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL