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 相关文章推荐
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
May 25 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
Dec 05 Javascript
关于js内存泄露的一个好例子
Dec 09 Javascript
js实现俄罗斯方块小游戏分享
Jan 31 Javascript
jQuery实现简单的日期输入格式化控件
Mar 12 Javascript
JS实现漂亮的时间选择框效果
Aug 20 Javascript
Vue 单文件中的数据传递示例
Mar 21 Javascript
koa-router源码学习小结
Sep 07 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
Sep 25 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
May 21 Javascript
Vue中this.$nextTick的作用及用法
Feb 04 Javascript
Vue如何实现变量表达式选择器
Feb 18 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学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
php中strtotime函数性能分析
2016/11/20 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
javascript getElementsByClassName函数
2010/04/01 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
JQuery导航菜单选择特效
2016/04/11 Javascript
JS获取一个未知DIV高度的方法
2016/08/09 Javascript
纯JS实现弹性导航条效果
2017/03/06 Javascript
JavaScript之map reduce_动力节点Java学院整理
2017/06/29 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
JS实现继承的几种常用方式示例
2019/06/22 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
python中黄金分割法实现方法
2015/05/06 Python
django 多数据库配置教程
2018/05/30 Python
python requests 测试代理ip是否生效
2018/07/25 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
python标准库os库的函数介绍
2020/02/12 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
python 写一个性能测试工具(一)
2020/10/24 Python
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
领先的英国注册在线药房 :Simply Meds Online
2019/03/28 全球购物
小学教师国培感言
2014/02/08 职场文书
英语教师自荐信
2014/05/26 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
JS + HTML 罗盘式时钟的实现
2021/05/21 Javascript
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫
Python OpenCV之常用滤波器使用详解
2022/04/07 Python