流简介

流的基本概念

程序中的流是一个抽象概念,当程序需要从某个数据源读取数据时,就会开启一个数据流,数据源可以是文件、内存或者网络等,而当程序将数据写入某个数据源时,也会开启一个数据流,而数据源的目的地也可以是文件、内存或者网络等。

以文件流为例,当需要读取一个文件时,如果使用 fs 模块的 readFile() 方法读取,程序会将该文件的内容视为一个整体,为其分配缓存区并一次性将内容读取到缓存区中,在这期间,Node.js 将不能执行任何其他处理,这就可能导致一个问题,即如果文件很大,会耗费较多的时间。

如果使用文件流读取文件,则可以将文件一部分一部分地读取,这样可以保证效率,并且不会占用太大的内存。下面介绍流的基本类型,以及如何引用。

流的基本类型

Node.js 中的流有 4 种基本类型,分别如下。

  • Readable:可读流。

  • Writable:可写流。

  • Duplex:可读可写流(也称双工流)。

  • Transform:转换流,表示在读写过程中可以修改和变换数据的 Duplex 流。

流模块的引用

使用 Node.js 中的流之前,首先要引用 stream 模块,代码如下:

const stream = require('stream');

了解Buffer

Buffer 翻译为中文是缓冲区,读者也可以理解为:一个 Buffer 就是开辟的一块内存区域,Buffer 的大小就是开辟的内存区域的大小。在流中,Buffer 的大小取决于传入流构造函数的 highWaterMark 选项参数,该参数指定了字节总数或者对象总数,当可读缓冲区的总大小达到 highWaterMark 指定的阈值时,流会暂时停止从数据源读取数据,直到当前缓冲区的数据被释放;如果要获取缓冲区中存储的数据,需要使用 writable.writableBufferreadable.readableBuffer