Buffer对象,是Node的核心模块,在面试中也是会频繁被问到一个考题,若是没有对其深刻探究,可能就跟我同样只会用,一旦面试官扩展问些问题可能就不会了。反正,当时我也只能回答说:目前涉及到的业务对Buffer模块用的比较少,可是Buffer对象能够对于一些字符串传输没法知足业务功能和性能上获得有效的优化。javascript
因此,今天学习一下Buffer对象。java
Buffer对象用于表示固定长度的字节序列面试
// 建立一个长度为 十、以零填充的 Buffer。
const buf1 = Buffer.alloc(10);
// 建立一个长度为 10 的 Buffer,
// 其中所有填充了值为 `1` 的字节。
const buf2 = Buffer.alloc(10, 1);
var str="hello Jasen";
var buf = new Buffer.from(str,'utf-8');
console.log(buf);
//输出:<Buffer 68 65 6c 6c 6f 20 4a 61 73 65 6e>
复制代码
观察输出的结果,Buffer对象相似一个数组。数组
Buffer对象中的每一个元素都是16进制的两位数(即0到255的数值)markdown
对Buffer某个元素赋值若是小于0的,会逐次加256,直到获得一个0到255范围的值,若是大于255则逐次减256,直到获得0-255范围得值,若是是小数的话,则直接取整。网络
大部分网络传输的时候会使用经过使用字符串,这不免须要转换成Buffer,以二进制方式进行数据传输。若是咱们直接预先转换为Buffer 再进行传输,那么在传输过程当中无需作额外的转换,也避免了损耗,使性能获得提高。并发
如下经过ab进行一次性能测试,发起200个并发客户端请求的结果,QPS提高的不是很高,但仍是有一点点的提高,能够复制代码执行下,是否结果和我同样性能
var http = require('http');
var str = "";
for (var i = 0; i < 1024 * 10; i++) {
str += "a";
}
str = new Buffer.from(str,'utf-8');
http.createServer(function (req, res) {
res.writeHead(200);
res.end(bufstr);
}).listen(8002);
复制代码
Stream 也是Node的核心模块,数据就像流水同样,流是对输入输出设备的抽象,是一组有序的、有起点和终点的字节数据传输手段。学习
Node.js 中有四种基本的流类型:测试
Duplex
流场景:
文件分片上传下载,好比下载电影时能够边下载边看,这样一个实现过程。