博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js中流的使用
阅读量:6834 次
发布时间:2019-06-26

本文共 2116 字,大约阅读时间需要 7 分钟。

流是基于事件的API,用于管理和处理数据,而且有不错的效率.

借助事件和非阻塞I/O库,流模块允许在其可用的时候动态处理,在其不需要的时候释放掉.

使用流的好处

举一个读取文件的例子:

使用fs.readFileSync同步读取一个文件,程序会被阻塞,所有的数据都会被读取到内存中.
换用fs.readFile读取文件,程序不会被阻塞,但是所有的数据依旧会被一次性全部被读取到内存中.
当处理大文件压缩,归档,媒体文件和巨大的日志文件的时候,内存使用就成了问题,在这种情况下,流的优势就体现出来了.
流被设计为异步的方式.相比将剩余的文件数据一次性读进内存,还是值得读取一个缓冲区,期望的操作将会被执行,而且结果会被写到输出流.

图片描述

流的分类

  1. stream.Readable---用于在I/O上获取数据

  2. stream.Writable---用于在输出的目标写入数据

  3. stream.Duplex---一个可读可写的流,例如网络连接

  4. 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模式:

  1. 监听'data'事件.

  2. 调用stream.resume()方法.

  3. 调用stream.pipe()方法将数据发送到Writable

处于flowing模式可读流,可以通过下面两种途径切换到paused模式:

  1. 如果不存在管道目标,可以通过调用stream.pause()方法实现

  2. 如果存在管道目标,可以通过取消'data'事件监听,并调用stream.unpipe()方法移除所有管道来实现

可读流事件

可读流提供了以下事件:

  1. 'close'事件,事件将在流或底层资源关闭后触发,但不是所有的流都会触发该事件.

  2. 'data'事件,data事件将会在流将数据传递给消费者时触发.当流转换到flowing模式时会触发该事件.

  3. 'end'事件,end事件只有在数据被完全消费后才会触发.

  4. 'error'事件,error事件会在底层系统内部出错从而不能产生数据,或当流的实现试图传递错误数据时发生.

  5. 'readble'事件,readable事件将在流中有数据可供读取时触发.

---未完待续---

转载地址:http://unxkl.baihongyu.com/

你可能感兴趣的文章
用委托者模式实现的多类型Adapter
查看>>
大数据技术于应用 可视化图表的开发应用
查看>>
说说MySQL索引相关
查看>>
小猿圈Java学习之程序员需要注意的5项守则
查看>>
CentOS 6.5安装Redis-2.8.23
查看>>
Django模板和变量的使用
查看>>
一、Python核心编程(对象)
查看>>
centos编译安装nginx1.16.0
查看>>
PostgreSQL学习手册(PL/pgSQL过程语言)
查看>>
架构师十个学习步骤_导读地图
查看>>
Linux find命令的使用方法
查看>>
UIWindow强制切换界面
查看>>
Glib Glibc
查看>>
Android平台targetSdkVersion设置及动态权限
查看>>
Tomcat解决UTF-8乱码的问题
查看>>
fiddler2抓包工具使用教程
查看>>
CSS的概述
查看>>
mysql对数据库的表的特殊限定——JEPLUS快速开发平台
查看>>
eyoucms上传不了logo,重试总是失败
查看>>
确认下眼神,这是你需要的MES软件吗?
查看>>