Buffer
1.无需require的一个全局变量
2.实现Nodejs 平台下的二进制数据操作
3.不占据v8堆内存大小的内存空间
4.内存的使用由Node来控制,由v8的gc回收
5.一般配合Stream流的使用,充当数据缓冲区
Buffer创建
Buffer.alloc(size[, fill[, encoding]])
size 新的 Buffer 所需的长度。 fill | | | 用于预填充新 Buffer 的值。 默认值: 0。 encoding 如果 fill 是字符串,则这就是它的编码。 默认值: 'utf8'。
const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=','base64');
console.log(buf);
// <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
Buffer.allocUnsafe(size)
size 新的 Buffer 所需的长度。 分配 size 个字节的新 Buffer。 如果 size 大于 buffer.constants.MAX_LENGTH 或小于 0,则抛出 ERR_INVALID_ARG_VALUE。
以这种方式创建的 Buffer 实例的底层内存不会被初始化。 新创建的 Buffer 的内容是未知的,可能包含敏感的数据。 使用 Buffer.alloc() 来用零初始化 Buffer 实例。 会有安全性问题
const buf = Buffer.allocUnsafe(10);
console.log(buf);
// (内容可能会有所不同): <Buffer a0 8b 28 3f 01 00 00 00 50 32>
Buffer.from(array): 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)
Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer。 Buffer.from(buffer): 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例 Buffer.from(string[, encoding]): 返回一个被 string 的值初始化的新的 Buffer 实例
// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);
// 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
const buf5 = Buffer.from('tést');
// 创建一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。
const buf6 = Buffer.from('tést', 'latin1');
Buffer 实例方法
buf.fill(value[, offset[, end]][, encoding])
value | | | 用于填充 buf 的值。 offset 在开始填充 buf 之前要跳过的字节数。 默认值: 0。 end 停止填充 buf(不包括在内)的位置。 默认值: buf.length. encoding 如果 value 是字符串,则为 value 的编码。 默认值: 'utf8'。 返回: buf 的引用。
const b = Buffer.allocUnsafe(50).fill('h');
console.log(b.toString());
// 打印: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
buf.write(string[, offset[, length]][, encoding])
string 要写入 buf 的字符串。 offset 开始写入 string 之前要跳过的字节数。 默认值: 0。 length 要写入的最大字节数(写入的字节数不会超过 buf.length - offset)。 默认值: buf.length - offset。 encoding string 的字符编码。 默认值: 'utf8'。 返回: 写入的字节数。
const buffer = Buffer.alloc(10);
const length = buffer.write('abcd', 8);
console.log(`${length} bytes: ${buffer.toString('utf8', 8, 10)}`);
// 打印: 2 bytes : ab
buf.toString([encoding[, start[, end]]])
encoding 要使用的字符编码。 默认值: 'utf8'。 start 开始解码的字节偏移量。 默认值: 0。 end 停止解码的字节偏移量(不包括在内)。 默认值: buf.length. 返回:
buf = Buffer.from('学习Buffer')
console.log(buf)
console.log(buf.toString('utf-8', 3, 9))
buf.slice([start[, end]])
start 新的 Buffer 将开始的位置。 默认值: 0。 end 新的 Buffer 将结束的位置(不包括在内)。 默认值: buf.length. 返回: 返回新的 Buffer,其引用与原始缓冲区相同的内存,但由 start 和 end 索引进行偏移和裁剪。
buf = Buffer.from('node的学习')
let b2 = buf.slice(3,6)
let b1 = buf.slice(-3)
console.log(b1)
console.log(b1.toString())
buf.indexOf(value[, byteOffset][, encoding])
value | | | 要搜索的内容。 byteOffset 开始搜索 buf 的位置。 如果为负数,则从 buf 的末尾开始计算偏移量。 默认值: 0。 encoding 如果 value 是字符串,则这是用于确定将在 buf 中搜索的字符串的二进制表示的编码。 默认值: 'utf8'。 返回: buf 中第一次出现 value 的索引,如果 buf 不包含 value,则为 -1。
const buf = Buffer.from('this is a buffer');
console.log(buf.indexOf('this'));
// 打印: 0
console.log(buf.indexOf('is'));
// 打印: 2
console.log(buf.indexOf(Buffer.from('a buffer')));
// 打印: 8
console.log(buf.indexOf(97));
// 打印: 8 (97 是 'a' 的十进制 ASCII 值)
console.log(buf.indexOf(Buffer.from('a buffer example')));
// 打印: -1
console.log(buf.indexOf(Buffer.from('a buffer example').slice(0, 8)));
// 打印: 8
buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
target | 要复制到的 Buffer 或 Uint8Array。 targetStart target 内开始写入的偏移量。 默认值: 0。 sourceStart buf 内开始复制的偏移量。 默认值: 0。 sourceEnd buf 内停止复制的偏移量(不包括)。 默认值: buf.length. 返回: 复制的字节数。
let b1 = Buffer.alloc(6)
let b2 = Buffer.from('学习')
b2.copy(b1, 3, 3, 6)
console.log(b1.toString())
console.log(b2.toString())
Buffer静态方法
Buffer.concat(list[, totalLength])
list <Buffer[]> | <Uint8Array[]> 要连接的 Buffer 或 Uint8Array 实例的列表。 totalLength 连接时 list 中 Buffer 实例的总长度。 返回: 返回新的 Buffer,它是将 list 中的所有 Buffer 实例连接在一起的结果。
如果列表没有条目,或者 totalLength 为 0,则返回新的零长度 Buffer。
let b1 = Buffer.from('我要')
let b2 = Buffer.from('学习')
let b = Buffer.concat([b1, b2], 9)
console.log(b)
console.log(b.toString())
Buffer.isBuffer(obj)
obj 返回:
Buffer.isBuffer(Buffer.alloc(10)); // true
Buffer.isBuffer(Buffer.from('foo')); // true
Buffer.isBuffer('a string'); // false
ArrayBuffer.prototype.split 的实现
ArrayBuffer.prototype.split = function (sep) {
let len = Buffer.from(sep).length
let ret = []
let start = 0
let offset = 0
while( offset = this.indexOf(sep, start) !== -1) {
ret.push(this.slice(start, offset))
start = offset + len
}
ret.push(this.slice(start))
return ret
}
let buf = 'addfvsdfdsafaraea'
let bufArr = buf.split('a')
console.log(bufArr)