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中各字符串出现次数的工具
May 03 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
May 05 Javascript
Javascript中arguments对象详解
Oct 22 Javascript
常用的JavaScript模板引擎介绍
Feb 28 Javascript
jQuery垂直多级导航菜单代码分享
Aug 18 Javascript
学习javascript面向对象 理解javascript对象
Jan 04 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
Mar 25 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
Aug 24 Javascript
基于node.js制作简单爬虫教程
Jun 29 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
Sep 19 jQuery
vue+iview+less 实现换肤功能
Aug 17 Javascript
vue通过video.js解决m3u8视频播放格式的方法
Jul 30 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
第一节--面向对象编程
2006/11/16 PHP
测试您的 PHP 水平的题目
2007/05/30 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
js用闭包遍历树状数组的方法
2014/03/19 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
java、javascript实现附件下载示例
2014/08/14 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
2017/07/11 jQuery
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
Python 字典dict使用介绍
2014/11/30 Python
Python的string模块中的Template类字符串模板用法
2016/06/27 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
Python使用smtp和pop简单收发邮件完整实例
2018/01/09 Python
python编程嵌套函数实例代码
2018/02/11 Python
python学生管理系统学习笔记
2019/03/19 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
利用Python模拟登录pastebin.com的实现方法
2019/07/12 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
歌颂党的演讲稿
2014/09/10 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书
护士2014年终工作总结
2014/11/11 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
小程序实现文字循环滚动动画
2021/06/14 Javascript