当前位置:首页 > 日记 > 正文

Node.js中流 | stream的使用方法示例

Node.js中流 | stream的使用方法示例

前言

本文主要给大家介绍了关于Node.js 流(stream)的使用方法,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍:

流是基于事件的API,用于管理和处理数据,而且有不错的效率.借助事件和非阻塞I/O库,流模块允许在其可用的时候动态处理,在其不需要的时候释放掉.

使用流的好处

举一个读取文件的例子:

使用fs.readFileSync同步读取一个文件,程序会被阻塞,所有的数据都会被读取到内存中.

换用fs.readFile读取文件,程序不会被阻塞,但是所有的数据依旧会被一次性全部被读取到内存中.

当处理大文件压缩,归档,媒体文件和巨大的日志文件的时候,内存使用就成了问题,在这种情况下,流的优势就体现出来了.

流被设计为异步的方式.相比将剩余的文件数据一次性读进内存,还是值得读取一个缓冲区,期望的操作将会被执行,而且结果会被写到输出流.

流的分类

  • 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事件将在流中有数据可供读取时触发.

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。

相关文章

Vue-Router进阶之滚动行为详解

Vue-Router进阶之滚动行为详解

进阶,详解,电脑软件,Vue,Router,滚动行为使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。 vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。注意: 这个功能只在 HTML5 hi…

Photoshop设计科技感十足的banner

Photoshop设计科技感十足的banner

教程,电脑软件,Photoshop,感十足,banner,教你使用Photoshop设计科技感十足的banner底图,教程简单粗暴,只要几步即可完成。本次教程内容是来自Seso的作品,充满科技感的效果可以用到科技、家电、电子类产品的Banner的背景中,那么如何设计出这样的…

在bootstrap中实现轮播图实例代码

在bootstrap中实现轮播图实例代码

实例代码,轮播图,电脑软件,bootstrap,Bootstrap中轮播图插件叫作Carousel以下容器就是整个轮播图组件的整体,注意该盒子必须加上 class=”carousel slide” data-ride=”carousel” 表示当 前是一个轮播图bootstrap.js会自动为当前元素添加…

BootStrap中jQuery插件Carousel实

BootStrap中jQuery插件Carousel实

插件,效果,广告,电脑软件,BootStrap,轮播广告在网站中的应用实在是太常见了,下面说一说怎样使用bootstrap中的Carousel插件来实现轮播广告效果,下图为最终效果:具体实现方法请看下面的代码:<div class="carousel slide" data-ride="carousel…

Ps怎么设计出超酷的抽象图案?

Ps怎么设计出超酷的抽象图案?

抽象,超酷,图案,电脑软件,Ps,怎么也想不到,效果图竟是用简单的渐变工具来完成。过程也非常简单:选择黑白渐变后,在属性栏把混合模式改为&ldquo;差值&rdquo;。然后就可以随意拉渐变,即可得到一些抽象图案。后期再通过复制及叠加等做出更为复杂的…

php常用数组函数实例小结

php常用数组函数实例小结

数组函数,实例,常用,电脑软件,php,本文实例总结了php常用数组函数。分享给大家供大家参考,具体如下:1. array array_merge(array $array1 [, array $array2 [, $array]])函数功能:将一个或多个数组的单元合并起来,一个数组中的值附加在前一个…

ps怎么设计一款毛笔字体的水墨字效

ps怎么设计一款毛笔字体的水墨字效

字体,水墨,效果,电脑软件,ps,跟大家分享一下毛笔字怎么做出来的,主要通过字体和素材叠加,十分简单,喜欢的一起练习。做完记得交作业。先看看最终效果:软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-04软件名…

excel2010密码忘记了的处理方法exc

excel2010密码忘记了的处理方法exc

密码,处理方法,密码保护,忘记了,电脑软件,  在Excel中经常需要用到密码进行对重要数据的保护,但是可能过了段时间过后就已经忘记了密码,这个时候就需要我们用点技巧才可以把文档打开了。今天,小编就教大家Excel2010密码保护忘记的处理方法!Ex…

谈谈JavaScript数组常用方法总结

谈谈JavaScript数组常用方法总结

常用方法,数组,电脑软件,JavaScript,在JavaScript中,我们需要时常对数组进行操作,现在特将常用方法总结如下:1.增加数据在JavaScript为数组增加数据主要分为两种方式。 从数组末尾增加内容:push方法从数组的前端增加内容:unshift方法这两种方法…

PS怎么批量复制图层与批量删除图层

PS怎么批量复制图层与批量删除图层

删除图层,图层,批量,电脑软件,PS,我们用PS制图,有时需要大量的复制同一个图层,如何才能快速的便捷的复制出来呢?又如何把多出来不需要的大量图层给一次性删除呢?下面我们一起来看下具体是如何操作的。软件名称:Adobe Photoshop 8.0 中文完整绿色…

ps怎么给简笔画小鸟添加飞翔的动画

ps怎么给简笔画小鸟添加飞翔的动画

动画效果,小鸟,简笔画,电脑软件,ps,ps中想要制作一段动画,该怎么直走呢?下面我们就来看看给小鸟添加动画效果的教程。软件名称:Adobe photoshop 7.01 官方正式简体中文版软件大小:154MB更新时间:2013-04-191、首先启动Photoshop cs5,执行文件-新…

painter怎么使用画笔中的马克笔画

painter怎么使用画笔中的马克笔画

画图,马克笔,电脑软件,painter,Painter中画笔有很多样式,今天我们就来看看画笔中马克笔的使用方法。软件名称:Corel Painter(绘画软件) 2018 官方正式版(附注册机) 在线安装包 64位软件大小:994KB更新时间:2017-06-301、打开Painter软件,鼠标左…