学Node必须掌握的Buffer和Stream

2019-08-20 admin

本文并不介绍 Buffer 和 Stream 使用的api,而是把对 Buffer 和 Stream 的理解带给大家。

之前发了篇文章《Nodejs核心模块简介》,笼统的介绍了下 Events模块、fs模块、stream的使用、http模块。

文章也在我的 github 博客上,欢迎订阅。

因为想学好 node 这些东西几乎是必须掌握的。这篇文章来说一下在 node 中几乎无处不在的 Buffer 和 Stream,什么是 Buffer 以及它和 Stream 到底什么关系? 马上揭晓。

Buffer 是个类数组的对象,可以把它当做数组更好理解些,只不过里面存的是二进制数据。

先创建个 buffer 来看看它打印出来的样子:

const str = 'hello';
const buf = Buffer.from(str);

console.log(buf); // <Buffer 68 65 6c 6c 6f>

buf 里装的数据是字符串 hello,而 buf 的长度为 5 ,hello 的长度也是 5,所以 Buffer 中每个元素占一个字节(英文每个字母是一个字节)。

Buffer 是什么

从代码使用来看,Buffer 是类数组对象。 从内存角度看,Buffer 是在内存中开辟的一块区域。

Buffer 翻译过来是缓冲器,它主要用来暂存数据。

为了更好理解,用大白话把上面哪句翻译一下:Buffer 就是我们常坐的公交车就是数据,人上车就表示在 Buffer 中输入数据, 到站了人就下车,Buffer 里的数据就会输出

比如我们填写完表单,发送 http 请求到服务端,我们的数据就会暂存在 Buffer 中,服务端取的数据就是从暂存的 Buffer 里取的

Buffer 里装的是什么

废话!装的当然是数据了!没错 是数据…

<Buffer 68 65 6c 6c 6f>, 从刚才打印结果看,Buffer 显示的每个元素都是十六进制,但这只是为了方面查看,在控制台显示时是十六进制而已。。。

这里问问大家,数据在内存中是什么? 没错 是二进制,就是类似010101这样的东西。 为什么以二进制存在?因为电脑读写的数据都是电信号! 而电信号就是 01

好在我们可以把二进制、十进制、十六进制等进行转换,所以 Buffer 的每个元素看上去是十六进制,其实内存里存的都是二进制。

Buffer 的每个元素取值范围是多少呢?

  • 00 - ff(十六进制)
  • 0 - 255(十进制)
  • 00000000 - 11111111 (二进制)

255 这个数字肯定见过不少,比如 css 中的 rgba 每个值的范围是 0-255

而 255 其实跟 ASCII码 紧紧相连,回顾一下上面代码中打印 hello 的 buffer :<Buffer 68 65 6c 6c 6f>,然后对照下面这个 ASCII 表

3

再对照 buffer 里的每个元素: 3

是不是一下就明白了, 原来数据就是这样纸的呀。 当然,上面的 hello 使用的是国际统一码,是 0 - 127,后128个(128—255)称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。

Stream 与 Buffer

亲! 先把进制问题和ASCII码放一边,现在你的脑子里只有公交车

Stream 翻译过来就是流,流动的意思,《Nodejs核心模块简介》里也简单的介绍了这块内容,有兴趣可以看看。

既然 Stream 是流动的,那它跟 Buffer 到底有啥联系?

现在回到 人和公交车 的问题,上面说 是数据,公交车本身是 Buffer,Buffer 里有没有数据 取决于在不在里面。

注意,我上面说的是公交车本身,没有说公交车有没有在跑。

所以,聪明的你猜到了,跑着的公交车就是 Stream。

流的原则是:有源头、有终点、源头流向终点。 公交车就是这样,从起点发车,载着数据(人)往终点跑。

光说不行,来看一段代码:

const fileReadStream = fs.createReadStream('./logs/hello.log');
const fileWriteStream = fs.createWriteStream('./logs/hello2.log');

fileReadStream.on('data', chunk => {
  console.log(chunk);
  fileWriteStream.write(chunk); 
});

打印结果如下: 1

从图看出,hello.log数据很多,一个 buffer(公交车) 装不完, 打印了好几次的 chunk 才完成写入,每个 chunk 都是一个buffer,都填满了数据(人)。 流可以看成是公交司机,流的作用就是将 buffer 从一个地方(起点)运送的另一个地方(终点)。

总结

现在捋一下:

  1. Buffer 就是在内存中开辟一段空间,用来装数据的
  2. 数据都是二进制的,记住电信号(010101)
  3. Stream 的三大原则:有源头、有终点、源头流向终点。
  4. Stream 就像司机,它的作用就是将装着数据的 Buffer 开向终点

[转载]原文链接:https://segmentfault.com/a/1190000020129087

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处。

转载请注明:文章转载自 JavaScript中文网 [https://www.javascriptcn.com]

本文地址:https://www.javascriptcn.com/read-73051.html

文章标题:学Node必须掌握的Buffer和Stream

相关文章
为什么要选择Nodejs?Nodejs有什么好处?
什么?JavaScript还能用作服务器编程! Caleb Madrigal是来自美国密尔沃基市的一名软件顾问。四年前,他在听说“将JavaScript用作服务器端语言”这样的说法时,认为那是一个荒唐的想法。有那么多服务器端语言可供选择,为...
2015-11-12
js性能优化 如何更快速加载你的JavaScript页面
确保代码尽量简洁 不要什么都依赖JavaScript。不要编写重复性的脚本。要把JavaScript当作糖果工具,只是起到美化作用。别给你的网站添加大量的JavaScript代码。只有必要的时候用一下。只有确实能改善用户体验的时候用一下。 ...
2015-11-12
10个强大的纯CSS3动画案例分享
我们的网页外观主要由CSS控制,编写CSS代码可以任意改变我们的网页布局以及网页内容的样式。CSS3的出现,更是可以让网页增添了不少动画元素,让我们的网页变得更加生动有趣,并且更易于交互。本文分享了10个非常炫酷的CSS3动画案例,希望大家...
2015-11-16
v-charts | 饿了么团队开源的基于 Vue 和 ECharts 的图表工具
在使用echarts生成图表时,经常需要做繁琐的数据类型转化、修改复杂的配置项,v-charts的出现正是为了解决这个 痛点。基于Vue2.0和echarts封装的v-charts图表组件,只需要统一提供一种对前后端都友好的数据格式 设置简...
2018-05-24
Node.js 2014这一年发生了什么
Node.js 的 2014 年充满了不幸和争议. 这一年 Noder 们经历了太多的伤心事, 经历了漫长的等待, 经历了沉重的分裂之痛. 也许 Noder 们不想回忆14年 Node.js land 发生的事情, 但正因为痛才更有铭记的价...
2015-11-12
JavaScript实现PC手机端和嵌入式滑动拼图验证码三种效果
PC和手机端网站滑动拼图验证码效果源码,同时包涵了弹出式Demo,使用ajax形式提交二次验证码所需的验证结果值,嵌入式Demo,使用表单形式提交二次验证所需的验证结果值,移动端手动实现弹出式Demo三种效果 首先要确认前端使用页面,比如...
2017-03-17
Vue获取DOM元素样式和样式更改示例
在 vue 中用 document 获取 dom 节点进行节点样式更改的时候有可能会出现 ‘style’ is not definde的错误,这时候可以在 mounted 里用 $refs 来获取样式,并进行更改: &lt;template...
2017-03-13
从2014年的发展来展望JS的未来将会如何
&lt;font face=&quot;寰�杞�闆呴粦, Arial, sans-serif &quot;&gt;2014骞达紝杞�浠惰�屼笟鍙戝睍杩呴€燂紝鍚勭�嶈��瑷€灞傚嚭涓嶇┓锛屼互婊¤冻鐢ㄦ埛涓嶆柇鍙樺寲鐨勯渶姹傘€傝繖浜涜��...
2015-11-12
12个你未必知道的CSS小知识
虽然CSS并不是一种很复杂的技术,但就算你是一个使用CSS多年的高手,仍然会有很多CSS用法/属性/属性值你从来没使用过,甚至从来没听说过。 1.CSS的color属性并非只能用于文本显示 对于CSS的color属性,相信所有Web开发人员...
2015-11-12
ajax为什么令人惊异?ajax的优缺点
使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变的信息。 Ajax不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。就像DHT...
2015-11-12
回到顶部