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 相关文章推荐
ie和firefox中img对象区别的困惑
Dec 27 Javascript
轻量级 JS ToolTip提示效果
Jul 20 Javascript
过虑特殊字符输入的js代码
Aug 05 Javascript
jQuery的缓存机制浅析
Jun 07 Javascript
浅谈$(document)和$(window)的区别
Jul 15 Javascript
ES6概念 Symbol.keyFor()方法
Dec 25 Javascript
javascript实现页面滚屏效果
Jan 17 Javascript
jQuery实现锚点向下平滑滚动特效示例
Aug 29 jQuery
JS字符串去除连续或全部重复字符的实例
Mar 08 Javascript
webpack4 处理CSS的方法示例
Sep 03 Javascript
webpack中如何加载静态文件的方法步骤
May 18 Javascript
JavaScript中BOM对象原理与用法分析
Jul 09 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
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
不错的PHP学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
PHP根据传入参数合并多个JS和CSS文件的简单实现
2014/06/13 PHP
php绘制圆形的方法
2015/01/24 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
给ListBox添加双击事件示例代码
2013/12/02 Javascript
Seajs的学习笔记
2014/03/04 Javascript
如何动态加载外部Javascript文件
2015/12/02 Javascript
javascript正则表达式总结
2016/02/29 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
2016/06/14 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
python实现视频分帧效果
2019/05/31 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
浅析HTML5页面元素及属性
2021/01/20 HTML / CSS
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
阿里巴巴的Oracle DBA笔试题答案-SQL tuning类
2016/04/03 面试题
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
学前教育专业毕业生自荐信
2013/10/03 职场文书
十佳大学生事迹材料
2014/01/29 职场文书
药剂专业毕业生求职信
2014/06/24 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
经济纠纷起诉状
2015/05/20 职场文书
行政处罚决定书
2015/06/24 职场文书
七一晚会主持词
2015/06/29 职场文书
2016教师政治学习心得体会
2016/01/23 职场文书