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的表单操作 简单计算器
Dec 29 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
Mar 05 Javascript
node.js中的fs.read方法使用说明
Dec 17 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
Jun 09 Javascript
Javascript 闭包详解及实例代码
Nov 30 Javascript
jQuery利用FormData上传文件实现批量上传
Dec 04 jQuery
详解Webpack如何引入CDN链接来优化编译后的体积
Jun 21 Javascript
浅析Angular 实现一个repeat指令的方法
Jul 21 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
Apr 20 Javascript
详细分析vue表单数据的绑定
Jul 20 Javascript
ESLint 是如何检查 .vue 文件的
Nov 30 Vue.js
jquery实现鼠标悬浮弹出气泡提示框
Dec 23 jQuery
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
人大复印资料处理程序_输入篇
2006/10/09 PHP
Laravel 5框架学习之用户认证
2015/04/09 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
JS循环遍历JSON数据的方法
2014/07/08 Javascript
ECMAScript5(ES5)中bind方法使用小结
2015/05/07 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
JavaScript中this的四个绑定规则总结
2016/09/26 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
JavaScript实现鼠标点击导航栏变色特效
2017/02/08 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
2020/05/08 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
[01:52]2020年DOTA2 TI10夏季活动预告片
2020/07/15 DOTA
详解Python中heapq模块的用法
2016/06/28 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
Python基于template实现字符串替换
2020/11/27 Python
python+playwright微软自动化工具的使用
2021/02/02 Python
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
2015年乡镇妇联工作总结
2015/05/19 职场文书
2015年店长个人工作总结
2015/10/23 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android
Python中npy和mat文件的保存与读取
2022/04/24 Python