当前位置: 首页 > 后端技术 > Node.js

学习Node必须掌握的Buffer和Stream

时间:2023-04-03 12:37:05 Node.js

本文不介绍Buffer和Stream使用的API,而是给大家带来对Buffer和Stream的认识。之前发过一篇文章《Nodejs核心模块简介》,大致介绍了Events模块,fs模块,stream的使用,http模块。文章也在我的github博客,欢迎订阅。因为想要学好node,掌握这些东西几乎是必须的。这篇文章会讲到在node中几乎无处不在的Buffer和Stream,什么是Buffer,它和Stream有什么关系?随即揭晓。BufferBuffer是一个类数组对象,可以更好的理解为数组,只不过它存储的是二进制数据。首先创建一个缓冲区,看看它是如何打印出来的:conststr='hello';constbuf=Buffer.from(str);console.log(buf);//buf里面的数据是字符串hello,buf的长度是5,hello的长度也是5,所以Buffer中的每个元素占一个字节(英文每个字母是一个字节)。什么是Buffer从代码使用的角度来看,Buffer是一个类数组对象。从内存的角度来看,Buffer是在内存中开辟的一块区域。Buffer译作缓冲区,主要用来临时存放数据。为了更好的理解,我们把上面这句话用大白话翻译一下:Buffer是我们经常乘坐的公交车,人就是数据。当人们上车时,他们在Buffer中输入数据。数据将被输出。比如我们填写完表单,向服务器发送http请求后,我们的数据会暂时存放在Buffer中。服务器取的数据就是从临时Buffer中取出的Buffer中包含的废话!当然是数据!没错,就是数据...,从刚才的打印结果来看,Buffer中显示的每一个元素都是十六进制的,不过这只是为了查看,在控制台显示的时候是十六进制而已二进制。..在这里问问大家,内存中的数据是什么?没错,它是二进制的,类似于010101。为什么要以二进制形式存在呢?因为电脑读写的数据都是电信号!电信号是0和1。幸运的是,我们可以转换二进制、十进制、十六进制等,所以Buffer的每个元素看起来都是十六进制的,但实际上内存是以二进制存储的。Buffer的各个元素取值范围是多少?00-ff(十六进制)0-255(十进制)00000000-11111111(二进制)255这个数字肯定见过很多,比如css中的rgba每个值的范围是0-255,255其实和ASCII一样代码紧密相连,回头看上面代码中打印hello的缓冲区:,然后将缓冲区中的每个元素与下面的ASCII表进行比较:是不是一目了然,原来的数据是这样的。当然,上面的hello使用的是国际统一编码,即0-127,最后128位(128-255)称为扩展ASCII码。许多基于x86的系统当前支持使用扩展(或“高”)ASCII。流和缓冲区专业版!抛开基本问题和ASCII码,现在你脑子里只有人和公共汽车。Stream的翻译是stream,意思是流。这个内容在《Nodejs核心模块简介》也有简单介绍。如果你有兴趣,你可以看看。Stream既然是流动的,那跟Buffer有什么关系呢?现在回到人和公共汽车的问题。说的是人就是数据,公交车本身就是缓冲区。缓冲区里有没有数据,取决于里面有没有人。注意,我上面说的是公交车本身,不是公交车有没有运行。所以,聪明的你猜到了,正在运行的总线是Stream。流动的原则是:有源必有终,源流向终。公交车就是这样,从起点出发,载着数据(人)到目的地。直接说不行,我们看一段代码:on('数据',chunk=>{console.log(chunk);fileWriteStream.write(chunk);});打印结果如下:从图中可以看出,hello.log数据很多,一个buffer(bus)填不满,print需要好几个chunk才能写完,每个chunk就是一个buffer,其中充满了数据(人)。流可以看作是一个总线驱动程序,流的作用是将缓冲区从一个地方(起点)运送到另一个地方(终点)。综上所述,我们现在来看一下:Buffer就是在内存中开辟一块空间,用来存放数据的数据都是二进制的。记住电信号(010101)流的三原则:有源头,有终点,源头流向终点。Stream就像一个驱动程序,它的作用是驱动有数据的Buffer到底