资讯专栏INFORMATION COLUMN

Node.js中流的使用

h9911 / 238人阅读

摘要:流是基于事件的用于管理和处理数据而且有不错的效率借助事件和非阻塞库流模块允许在其可用的时候动态处理在其不需要的时候释放掉使用流的好处举一个读取文件的例子使用同步读取一个文件程序会被阻塞所有的数据都会被读取到内存中换用读取文件程序不会被阻塞但

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

---未完待续---

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84007.html

相关文章

  • Node.js 中流操作实践

    摘要:事件的触发频次同样是由实现者决定,譬如在进行文件读取时,可能每行都会触发一次而在请求处理时,可能数的数据才会触发一次。如果有参数传入,它会让可读流停止流向某个特定的目的地,否则,它会移除所有目的地。 showImg(https://segmentfault.com/img/remote/1460000016328758?w=1967&h=821); 本文节选自 Node.js Chea...

    chaos_G 评论0 收藏0
  • 深入nodejs中流(stream)理解

    摘要:等文件一旦打开,立刻执行写入操作发射一个缓存区清空的事件自定义可写流为了实现可写流,我们需要使用流模块中的构造函数。 流的基本概念及理解 流是一种数据传输手段,是有顺序的,有起点和终点,比如你要把数据从一个地方传到另外一个地方流非常重要,gulp,webpack,HTTP里的请求和响应,http里的socket都是流,包括后面压缩,加密等流为什么这么好用还这么重要呢? 因为有时候我...

    tianyu 评论0 收藏0
  • 浅谈node.jsstream(流)

    摘要:在可读流事件里我们就必须调用方法。当一个对象就意味着我们想发出信号这个流没有更多数据了自定义可写流为了实现可写流,我们需要使用流模块中的构造函数。我们只需给构造函数传递一些选项并创建一个对象。 前言 什么是流呢?看字面意思,我们可能会想起生活中的水流,电流。但是流不是水也不是电,它只是描述水和电的流动;所以说流是抽象的。在node.js中流是一个抽象接口,它不关心文件内容,只关注是否从...

    elliott_hu 评论0 收藏0
  • 【全文】狼叔:如何正确学习Node.js

    摘要:感谢大神的免费的计算机编程类中文书籍收录并推荐地址,以后在仓库里更新地址,声音版全文狼叔如何正确的学习简介现在,越来越多的科技公司和开发者开始使用开发各种应用。 说明 2017-12-14 我发了一篇文章《没用过Node.js,就别瞎逼逼》是因为有人在知乎上黑Node.js。那篇文章的反响还是相当不错的,甚至连著名的hax贺老都很认同,下班时读那篇文章,竟然坐车的还坐过站了。大家可以很...

    Edison 评论0 收藏0
  • 【全文】狼叔:如何正确学习Node.js

    摘要:感谢大神的免费的计算机编程类中文书籍收录并推荐地址,以后在仓库里更新地址,声音版全文狼叔如何正确的学习简介现在,越来越多的科技公司和开发者开始使用开发各种应用。 说明 2017-12-14 我发了一篇文章《没用过Node.js,就别瞎逼逼》是因为有人在知乎上黑Node.js。那篇文章的反响还是相当不错的,甚至连著名的hax贺老都很认同,下班时读那篇文章,竟然坐车的还坐过站了。大家可以很...

    fengxiuping 评论0 收藏0

发表评论

0条评论

h9911

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<