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获取元素样式属性值的方法
Dec 25 Javascript
使用JavaScript构建JSON格式字符串实现步骤
Mar 22 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
Jun 03 Javascript
使用jQuery的attr方法来修改onclick值
Jul 07 Javascript
JS实现的3D拖拽翻页效果代码
Oct 31 Javascript
跟我学习javascript的全局变量
Nov 16 Javascript
jQuery简单验证上传文件大小及类型的方法
Jun 02 Javascript
Bootstrap文件上传组件之bootstrap fileinput
Nov 25 Javascript
canvas学习之API整理笔记(二)
Dec 29 Javascript
实例教学如何写vue插件
Nov 30 Javascript
Vue引入jquery实现平滑滚动到指定位置
May 09 jQuery
JavaScript实现网页动态生成表格
Nov 25 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环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
谈谈关于php的优点与缺点
2013/04/11 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
jquery $.ajax入门应用二
2008/11/19 Javascript
JavaScript 异步调用框架 (Part 6 - 实例 & 模式)
2009/08/04 Javascript
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
js 为label标签和div标签赋值的方法
2013/08/08 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
三种取消选中单选框radio的方法
2014/09/09 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
2018/04/26 Javascript
Bootstrap Table实现定时刷新数据的方法
2018/08/13 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
Python break语句详解
2014/03/11 Python
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
python通过getopt模块如何获取执行的命令参数详解
2017/12/29 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
基于python实现名片管理系统
2018/11/30 Python
python 实现dict转json并保存文件
2019/12/05 Python
Python在后台自动解压各种压缩文件的实现方法
2020/11/10 Python
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
《日月潭》教学反思
2014/02/28 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP