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 相关文章推荐
jquery 动态创建元素的方式介绍及应用
Apr 21 Javascript
jquery中的过滤操作详细解析
Dec 02 Javascript
Egret引擎开发指南之运行项目
Sep 03 Javascript
js代码验证手机号码和电话号码是否合法
Jul 30 Javascript
JavaScript实现斗地主游戏的思路
Feb 29 Javascript
原生js实现淘宝购物车功能
Jun 23 Javascript
jquery插件开发之选项卡制作详解
Aug 30 jQuery
AngularJS使用ui-route实现多层嵌套路由的示例
Jan 10 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
Sep 02 Javascript
解决layui动态添加的元素click等事件触发不了的问题
Sep 20 Javascript
nodemon实现Typescript项目热更新的示例代码
Nov 19 Javascript
Vue实现boradcast和dispatch的示例
Nov 13 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 ajax 分页类代码
2008/11/13 PHP
php下使用curl模拟用户登陆的代码
2010/09/10 PHP
php显示页码分页类的封装
2017/06/08 PHP
jQuery 插件 将this下的div轮番显示
2009/04/09 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
javascript模拟map输出与去除重复项的方法
2015/02/09 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
vue elementui form表单验证的实现
2018/11/11 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
Python中序列的修改、散列与切片详解
2017/08/27 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
2018/01/11 Python
简单实现python数独游戏
2018/03/30 Python
让代码变得更易维护的7个Python库
2018/10/09 Python
python根据url地址下载小文件的实例
2018/12/18 Python
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
Keras loss函数剖析
2020/07/06 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
2014年迎新年联欢会活动策划方案
2014/02/26 职场文书
班风学风建设方案
2014/05/06 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
聊聊配置 Nginx 访问与错误日志的问题
2022/05/25 Servers