Buffer
阅读 1.7k
无论是在前端处理文件时,还是在Node.js中查阅相关API时,都会发现一个有趣的东西:Buffer
,那么,到底什么是Buffer呢?
构造Buffer
简单说,Buffer就像一个存储字节
的数组,主要用于操作字节
,我们先来看看如何构造Buffer,一共有三种方法,先来看方法一
:
const buf1 = Buffer.alloc(10) // 10个字节的buffer, 默认值为0
const buf2 = Buffer.alloc(10, 254) // 10个字节的buffer, 每个值都填充为指定的fe(即254)
console.log(buf1)
console.log(buf2)
console.log(buf1.length)
控制台打印结果为:
<Buffer 00 00 00 00 00 00 00 00 00 00>
<Buffer fe fe fe fe fe fe fe fe fe fe>
10
因为一个字节为8位,用一个十六进制表示4位,所以,每个值在里面都用两个十六进制来表示,0表示为00,254表示为十六进制的fe。
再来看看第二种方式
:
const buf3 = Buffer.allocUnsafe(10)
buf3.fill(12)
console.log(buf3)
这种方式速度上比第一种方式要快一点,但请注意⚠️,这种方式创建的Buffer实例可能会包含旧数据,所以,在使用前记得用fill()
或write()
方法来对它进行填充,否则,你可能会得到一些意想不到的数据。
既然说它像数组,那么其创建方式是否有一种和数组很像呢?没错,数组有from()方法,来看第三种方式
:
const buf4 = Buffer.from([11, 22, 33])
console.dir(buf4)
打印结果如下:
Buffer(3) [Uint8Array] [ 11, 22, 33 ]
注意,和前两种方式不同,这种方式的结果是以数组的方式打印出来的。
和ArrayBuffer的关系
从上面的第三种创建方式的打印结果来看,是不是有点眼熟?没错,其底层用的正是ArrayBuffer
,且其内存分配大小为8k(由底层分配),通过上面方式创建出的Buffer对象,继承自Uint8Array,和用定型数组(如Int8Array、Int16Array等)创建的定型数组是非常相似的,所以,它的使用方式也和定型数组类似:
const buf4 = Buffer.from([11, 22, 33])
const buf5 = buf4.map((v) => v * 2)
console.dir(buf5)
因此,普通数组的很多方法,比如sort()、map()、filter()、find()、reverse()、indexof()、forEach()等方法,它也都可以使用。
参考
- Buffer | Node.js v16.15.1
- 深入浅出Node.js / 朴灵编著. 2013.12
最后编辑于: 2022-06-25