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 相关文章推荐
仿163填写邮件地址自动显示下拉(无优化)
Nov 05 Javascript
jQuery ajax BUG:object doesn't support this property or method
Jul 06 Javascript
jquery.cookie实现的客户端购物车操作实例
Dec 24 Javascript
详解Bootstrap插件
Apr 25 Javascript
微信js-sdk上传与下载图片接口用法示例
Oct 12 Javascript
node.js版本管理工具n无效的原理和解决方法
Nov 24 Javascript
原生js实现中奖信息无间隙滚动效果
Jan 18 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
Mar 24 jQuery
jQuery实现动态给table赋值的方法示例
Jul 04 jQuery
jquery ajaxfileupload异步上传插件
Nov 21 jQuery
bootstrap table实现iview固定列的效果实例代码详解
Sep 30 Javascript
jQuery 选择器用法基础入门示例
Jan 04 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
thinkphp框架实现删除和批量删除
2016/06/29 PHP
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
AngularJS页面传参的5种方式
2017/04/01 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
微信小程序tabBar底部导航中文注解api详解
2017/08/16 Javascript
用JavaScript做简易的购物车的代码示例
2017/10/20 Javascript
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
python如何实现excel数据添加到mongodb
2015/07/30 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
python十进制转二进制的详解
2020/02/07 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
用python制作个音乐下载器
2021/01/30 Python
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
介绍信的写法
2015/01/31 职场文书
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python