我们都知道nodejs的内存由于v8内存分配机制的原因十分有限
64位系统也只能占1.4G左右, 因此当我们要生成或者读取大文件的时候内存的吃紧会给我们造成极大的困扰, 遇到这样的情况Node给了我们一个很好的解决方法 stream
简单的了解一下流
流是数据的集合 —— 就像数组或字符串一样。区别在于流中的数据可能不会立刻就全部可用,并且你无需一次性地把这些数据全部放入内存。这使得流在操作大量数据或是数据从外部来源逐段发送过来的时候变得非常有用
管道与流的结合在linux中运用得非常多, 也使得linux能够通过 pipe
组合多个命令实现复杂的功能, 其实通俗一点来说, stream
就是把我们需要一口气吃下的东西分成多次按量的吃下去, 避免一口气吃撑, 在吃的过程中, 我们甚至可以边 ”吃“ 边 ”排“(transform), 使我们的身体能够保持一个均衡低负荷的状态, 同时, 也就是保证node进程内存不会太吃紧的条件.
nodejs中的流
因为先天的原因, 流在node中通常被我们用来处理大文件, 甚至说在nodejs的各类模块中均采用了 stream
- 在server中的
http request
是可读流(Readable Stream
),http response
是一个可写流(Writable Stream
), 这也就是为什么我们通常在request中读取client传回的值, 而通过response写入数据返回 - fs则是一个可读可写的流(
Duplex Stream
), 我们可以对一个文件进行写入和读取的操作
以上这些模块只是nodejs中流应用的一小部分场景, 在其官方API中流的类型和解释则是
Readable
- streams from which data can be read (for example fs.createReadStream()).Writable
- streams to which data can be written (for example fs.createWriteStream()).Duplex
- streams that are both Readable and Writable (for example net.Socket).Transform
- Duplex streams that can modify or transform the data as it is written and read (for example