Node 中的 Stream

流(Stream),是⼀个数据传输⼿段,是端到端信息交换的⼀种⽅式,⽽且是有顺序的,是逐块读取数

据、处理内容,⽤于顺序读取输⼊或写⼊输出

Node.js 中很多对象都实现了流,总之它是会冒数据(以 Buffer 为单位)它的独特之处在于,它不像传统的程序那样⼀次将⼀个⽂件读⼊内存,⽽是逐块读取数据、处理其内

容,⽽不是将其全部保存在内存中

流可以分成三部分: 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 模

块,能同时处理可读和可写⽂件流

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

stream 的应⽤场景主要就是处理 IO 操作,⽽ http 请求和⽂件操作都属于 IO 操作

试想⼀下,如果⼀次 IO 操作过⼤,硬件的开销就过⼤,⽽将此次⼤的 IO 操作进⾏分段操作,让数

据像⽔管⼀样流动,直到流动完成

常⻅的场景有:

get请求返回⽂件给客⼾端

1
2
3
4
5
6
7
8
9
const server = http.createServer(function (req, res) {
const method = req.method; // 获取请求⽅法
if (method === 'GET') { // get 请求
const fileName = path.resolve(__dirname, 'data.txt');
let stream = fs.createReadStream(fileName);
stream.pipe(res); // 将 res 作为 stream 的 dest
}
});
server.listen(8000);

⽂件操作

⼀些打包⼯具的底层操作