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 相关文章推荐
js 火狐下取本地路径实现思路
Apr 02 Javascript
js和jquery设置disabled属性为true使按钮失效
Aug 07 Javascript
javascript弹出页面回传值的方法
Jan 28 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
Mar 25 Javascript
JS iFrame加载慢怎么解决
May 13 Javascript
轻松掌握JavaScript享元模式
Aug 27 Javascript
基于slideout.js实现移动端侧边栏滑动特效
Nov 28 Javascript
js实现图片上传预览原理分析
Jul 13 Javascript
JavaScript正则表达式和级联效果
Sep 14 Javascript
vue webpack开发访问后台接口全局配置的方法
Sep 18 Javascript
VUE渲染后端返回含有script标签的html字符串示例
Oct 28 Javascript
基于vue-cli3和element实现登陆页面
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
Nginx实现反向代理
2017/09/20 Servers
解决php扩展安装不生效问题
2019/10/25 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
2013/07/05 Javascript
JavaScript的递归之递归与循环示例介绍
2013/08/05 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
js+csss实现的一个带复选框的下拉框
2014/09/29 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
JSON 数据详解及实例代码分析
2017/01/20 Javascript
javascript数据类型详解
2017/02/07 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
Vue下路由History模式打包后页面空白的解决方法
2018/06/29 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
微信小程序自定义toast组件的方法详解【含动画】
2019/05/11 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
[37:45]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS Orenda
2014/05/22 DOTA
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
决策树的python实现方法
2014/11/18 Python
使用FastCGI部署Python的Django应用的教程
2015/07/22 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
django解决跨域请求的问题详解
2019/01/20 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
纽约州一群才华横溢的金匠制作而成:Hearth Jewelry
2019/03/22 全球购物
班主任工作经验材料
2014/02/02 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
信息技术研修心得体会
2016/01/08 职场文书
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android