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 相关文章推荐
Javascript 个人笔记(没有整理,很乱)
Jul 07 Javascript
JavaScript 全角转半角部分
Oct 28 Javascript
JavaScript全局函数使用简单说明
Mar 11 Javascript
浅析jquery的js图表组件highcharts
Mar 06 Javascript
Jquery日期选择datepicker插件用法实例分析
Jun 08 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
Feb 20 Javascript
Javascript之图片的延迟加载的实例详解
Jul 24 Javascript
React 组件转 Vue 组件的命令写法
Feb 28 Javascript
4个顶级JavaScript高级文本编辑器
Oct 10 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
Dec 29 jQuery
Vue 刷新当前路由的实现代码
Sep 26 Javascript
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
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实现简单数字分页效果
2015/07/26 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
2016/03/23 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
laravel实现批量更新多条记录的方法示例
2017/10/22 PHP
JS取request值以及自动执行使用示例
2014/02/24 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
node.js中的console用法总结
2014/12/15 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
如何提高javascript加载速度
2016/12/26 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
浅谈Vue中render中的h箭头函数
2019/11/07 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
js 函数性能比较方法
2020/08/24 Javascript
python根据日期返回星期几的方法
2015/07/06 Python
python下os模块强大的重命名方法renames详解
2017/03/07 Python
Python之web模板应用
2017/12/26 Python
python基于SMTP协议发送邮件
2019/05/31 Python
python自动循环定时开关机(非重启)测试
2019/08/26 Python
用css3制作纸张效果(外翻卷角)
2013/02/01 HTML / CSS
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
美国NBA官方商店:NBA Store
2019/04/12 全球购物
iKRIX意大利网上商店:男女豪华服装和配件
2019/10/09 全球购物
大学生个人推荐信范文
2013/11/25 职场文书
创先争优个人承诺书
2014/08/30 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
spring boot中nativeQuery的用法
2021/07/26 Java/Android