Node.js中的流(stream)

前言

文章转载的原文链接:https://nodesource.com/blog/understanding-streams-in-nodejs
文章翻译的链接:http://www.imooc.com/article/296777?block_id=tuijian_wz
这篇文章主要是介绍Node.js中流(stream)的概念,我对其中我所需要的知识进行了提取,但是要了解更深入,建议看原文。
另外,本人正在学习node.js,如果文中有理解错误地方,麻烦帮指正,多谢!
开始正文:

流的概念

流是一种数据处理方法,用于按顺序将输入读写到输出中。

流是一种高效处理读/写文件、网络通信或任何端到端信息交换的方法。

流的特别之处在于,它不是向传统方式那样把文件一次性读取到内存中,而是逐段读取数据块,在不将其全部保存在内存中的情况下,处理文件的内容。

这使得流在处理大量数据时非常强大,例如,文件大小可能大于可用内存空间,因此无法将整个文件读入内存以进行处理。

然而,流不仅仅可以用于处理媒体或大数据。它们还赋予我们代码中“可组合性”的能力。考虑到可组合性的设计意味着可以以某种方式组合多个组件以产生相同类型的结果。在Node.js中,可以通过使用流在其他较小的代码片段之间传送数据来合成功能强大的代码片段。

流的优势

和其他数据处理方式相比,流有两个主要的优势:

内存效率:在处理数据之前,不需要在内存中加载大量数据
时间效率:一有数据,就可以开始处理数据,而不用等到整个数据传输完成后才开始处理。

流的分类

Writable: 可以写入数据的流。例如,fs.createWriteStream()允许我们使用流将数据写入文件。
Readable: 可以从中读取数据的流。例如:fs.createReadStream()允许我们读取文件的内容。
Duplex: 可读写的流。例如,net.Socket。
Transform: 可以在数据写入和读取时修改或转换数据的流。例如,在文件压缩的实例中,可以在文件中写入压缩数据和读取解压缩数据。
在基于Node.js的HTTP服务器中,request是可读流,response是可写流。fs模块,它允许你处理可读和可写的文件流。

两种读取模式

根据Streams API,可读流可以在两种模式中有效地运行:流动和暂停(flowing and paused)。可读流可以处于对象模式,也可以不处于对象模式,无论当前可读流是流动模式还是暂停模式。

流动模式下,数据从底层系统自动读取,并通过EventEmitter接口使用事件提供给应用程序。即要从流中读取数据,可以监听数据事件并添加一个回调函数。当数据块可用时,可读流会触发一个data事件,然后回调函数会执行。当数据都读取完毕,流会触发一个end事件。另外,如果有错误发生,流会触发一个error事件。

暂停模式下,必须显式调用stream.read()方法,直到读取了每个数据块。

所有可读流都以暂停模式开始,但可以通过以下方式之一切换到流动模式
1.添加data事件的回调函数
2.调用stream.resume()方法。
3.调用stream.pipe()方法将数据发送到可写文件。

可读流能够通过以下方式,重新切换到暂停模式
1.如果没有管道目标,调用stream.pause()方法。
2.如果有管道目的地,则删除所有管道目的地。可以通过调用stream.unpipe()方法删除多个管道目标。

注意:要记住的重要概念是,在提供使用或忽略该数据的机制之前,可读流不会生成数据。如果消费机制被禁用或取消,可读流将尝试停止生成数据。监听readable事件会自动使流停止流动,并通过readable.read()消耗数据。如果删除了readable事件回调函数,并且如果存在data事件回调函数,则流将重新开始流动。

pipeline

管道(Piping)是一种机制,我们将一个流的输出作为另一个流的输入。它通常用于从一个流获取数据并将该流的输出传递给另一个流。管道作业没有限制。换言之,管道用于分多个步骤处理流式数据。

Node.js 10.x中引入了stream.pipeline()。这是一个模块方法,用于在流之间进行管道传输,并在管道完成时正确清理和提供回调。
注意:应该使用pipeline而不是pipe,因为pipe不安全。

stream模块

Node.js的stream模块为所有流API构建提供了基础。

Stream模块是Node.js中默认提供的内置模块。流是EventEmitter类的一个实例,该类在节点中异步处理事件。因此,流本质上是基于事件的
为了创建一个stream模块,可以使用如下代码:

const stream = require('stream');

stream模块对于创建新类型的流实例非常有用。通常不需要使用流模块来使用流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值