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 相关文章推荐
window.open被浏览器拦截后的自定义提示效果代码
Nov 19 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
Mar 01 Javascript
JS获取农历日期具体实例
Nov 14 Javascript
JQuery选择器绑定事件及修改内容的方法
Jan 23 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
Jun 19 Javascript
Jquery代码实现图片轮播效果(一)
Aug 12 Javascript
jQuery Validate让普通按钮触发表单验证的方法
Dec 15 Javascript
JS前端加密算法示例
Dec 22 Javascript
微信小程序 css使用技巧总结
Jan 09 Javascript
Vue SPA单页应用首屏优化实践
Jun 28 Javascript
微信小程序实现订单倒计时
Nov 01 Javascript
js实现九宫格抽奖
Mar 19 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
ftp类(example.php)
2006/10/09 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
PHP7新功能总结
2019/04/14 PHP
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
nodeType属性返回被选节点的节点类型介绍
2013/11/22 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
Bootstrap进度条实现代码解析
2017/03/07 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
详解VUE 数组更新
2017/12/16 Javascript
JS隐藏号码中间4位代码实例
2019/04/09 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
javascript实现简易的计算器
2020/01/17 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
python导入坐标点的具体操作
2019/05/10 Python
Fanatics法国官网:美国体育电商
2019/08/27 全球购物
西班牙最好的在线购买葡萄酒的商店:Vinoseleccion
2019/10/30 全球购物
个人自我鉴定范文
2013/10/04 职场文书
综合办公室主任岗位职责
2014/04/13 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android