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实现的分页函数
Feb 07 Javascript
jQuery 源码分析笔记(2) 变量列表
May 28 Javascript
JavaScript学习笔记(一) js基本语法
Oct 25 Javascript
js实现鼠标滑过文字链接色彩变化的效果
May 06 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
Aug 04 Javascript
如何利用模板将HTML从JavaScript中抽离
Oct 08 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
Apr 13 Javascript
详解如何在react中搭建d3力导向图
Jan 12 Javascript
AngularJs分页插件使用详解
Jun 30 Javascript
Vue3.0数据响应式原理详解
Oct 09 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
Apr 22 Javascript
vue添加自定义右键菜单的完整实例
Dec 08 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数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
解析php防止form重复提交的方法
2013/07/01 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
PHP中的常见魔术方法功能作用及用法实例
2015/07/01 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
asm.js使用示例代码
2013/11/28 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
js中利用cookie实现记住密码功能
2020/08/20 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
Vue2单一事件管理组件通信
2017/05/09 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
vue.js响应式原理解析与实现
2020/06/22 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
python对象及面向对象技术详解
2016/07/19 Python
python的多重继承的理解
2017/08/06 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
英国豪华针织品牌John Smedley的在线销售商:The Outlet by John Smedley
2018/04/08 全球购物
关于Java finally的面试题
2016/04/27 面试题
地理科学专业毕业生求职信
2013/10/15 职场文书
蔬菜基地的创业计划书
2014/01/06 职场文书
人事主管岗位职责
2014/01/30 职场文书
工商管理专业自荐信
2014/06/03 职场文书
单位委托书怎么写
2014/08/02 职场文书
学校实习推荐信
2015/03/27 职场文书
遗嘱格式范本
2015/08/07 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技