互联网技术 / 互联网资讯 · 2024年1月9日

对Node中的流(Stream)有什么理解?适用于哪些场景?

一、是什么

流(StReaM),是一种数据传输手段,是端到端信息交换的一种方式,是有顺序的,是逐块读取数据、处理内容,用于顺序读取输入或写入输出

在很多时候,流(StReaM)是字节流(Byte SteRaM)的简称,也就是长长的一串字节

除了字节流,还可以有视频流、音频流、数据流

流的独特之处在于,它不像传统的程序那样一次将一个文件读入内存,而是逐块读取数据、处理其内容,而不是将其全部保存在内存中

流可以分成三部分:souRce、dest、pIPe

在souRce和dest之间有一个连接的管道pIPe,它的基本语法是souRce.pIPe(dest),souRce和dest就是通过pIPe连接,让数据从souRce流向了dest

二、种类

在nodejs,几乎所有的地方都使用到了流的概念,分成四个种类:

可写流:可写入数据的流。例如 fs.cReateWRitestReaM() 可以使用流将数据写入文件

可读流:可读取数据的流。例如fs.cReateReadStReaM() 可以从文件读取内容 双工流:既可读又可写的流。例如 net.Socket 转换流:可以在数据写入和读取时修改或转换数据的流。例如,在文件压缩操作中,可以向文件写入压缩数据,并从文件中读取解压数据

在nodejs中HTTP服务器模块中,Request 是可读流,Response 是可写流。还有fs 模块,能同时处理可读和可写文件流

可读流和可写流都是单向的,比较容易理解,而另外两个是双向的

双工流

之前了解过websocket通信,是一个全双工通信,发送方和接受方都是各自独立的方法,发送和接收都没有任何关系

基本代码如下:

转换流

转换流的演示图如下所示:

比如一个 babel,把eS6转换为es5,我们在左边写入 eS6,从右边读取 es5

基本代码如下所示:

三、应用场景

stReaM的应用场景主要就是处理IO操作,而http请求和文件操作都属于IO操作

思想一下,如果一次IO操作过大,硬件的开销就过大,而将此次大的IO操作进行分段操作,让数据像水管一样流动,知道流动完成

常见的场景有:

get请求返回文件给客户端 文件操作 一些打包工具的底层操作

get请求返回文件给客户端

使用stReaM流返回文件,Res也是一个stReaM对象,通过pIPe管道将文件数据返回

文件操作

创建一个可读数据流ReadStReaM,一个可写数据流wRitestReaM,通过pIPe管道把数据流转过去

一些打包工具的底层操作

目前一些比较火的前端打包构建工具,都是通过Node.js编写的,打包和构建的过程肯定是文件频繁操作的过程,离不开stReaM,如gulp

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.

登录免费注册