NodeJS学习笔记(二)

Buffer缓冲区

来源:处理类似TCP流或文件流(I/O)时,要用到二进制数据。因此,node定义了一个Buffer类,这个类用来创建一个专门存放二进制数据的缓冲区

一个Buffer类似于一个整数数组,但它对应V8堆内存之外的一块原始内存

由于Buffer对内存权限大,有点危险,因此在v6.0以后。官方建议使用Buffer.from()接口去创建Buffer对象

输出方式

const buf = Buffer.from('A','ascil');//用ascil编码来存,第二个参数是编码方式。不填吗,默认utf-8。Buffer.from返回一个新的Buffer实例

console.log(buf.toString('hex'));  //以十六进制去输出buf,结果72756e6f6f62
//toString里面可以传参数,以什么字符编码进行输出

创建Buffer

const buf1 = Buffer.alloc(10); //长度十,0填充

const buf2 = Buffer.alloc(10,1); //长度十,十六进制0x1填充

const buf3 = Buffer.allocUnsafe(10); //长度十,未初始化,性能比Buffer.alloc()更快。但是因为可能包含以前的旧数据的关系,因此可以使用fill()或者write()重写

const buf4 = Buffer.from([1,2,3]) //一个包含[0x1,0x2,0x3]的Buffer

const buf5 = Buffer.from('test'); //里面用了一些十六进制去存储字符串,第二个参数不填默认是utf-8编码

写入缓冲区

buf.write(string,offset,length,encoding)

string:写入缓冲区字符串

offset:缓冲区开始写入索引值,默认0

length:写入字节数,默认buffer.length

encoding:编码方式,默认utf-8

当空间不足时,只会写入部分,返回buf.write返回实际写入大小值

读取缓冲区

buf.toString(encoding,start,end)

start:默认0

end:默认缓冲区末尾

buf = Buffer.alloc(26);
for (var i = 0 ; i < 26 ; i++) {
  buf[i] = i + 97;
}

console.log( buf.toString('ascii'));       // 输出: abcdefghijklmnopqrstuvwxyz
console.log( buf.toString('ascii',0,5));   // 输出: abcde
console.log( buf.toString('utf8',0,5));    // 输出: abcde
console.log( buf.toString(undefined,0,5)); // 使用 'utf8' 编码, 并输出: abcde

Buffer转JSON对象

buf.toJSON() //字符串化Buffer实例时,JSON.stringify()隐式调用toJSON(),返回值为JSON对象
const buf = Buffer.from([0x1,0x2,0x3,0x4,0x5]);
const json = JSON.stringify(buf);

console.log(json); //{"type":"Buffer","data":"[1,2,3,4,5]"}

const cpy = JSON.parse(json,(key,value)=>{
    return value && value.type === 'Buffer'?Buffer.from(value.data):value;
})

console.log(copy);
// 输出: <Buffer 01 02 03 04 05>

缓冲区合并

Buffer.concat(list,totalLengh)
//list:用于合并的Buffer对象数组列表
//totalLengh:指定合并后Buffer对象的总长度
//返回一个多个成员合并的Buffer对象
var buffer1 = Buffer.from(('A'));
var buffer2 = Buffer.from(('B'));
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log(buffer3); //AB

缓冲区比较

buf.compare(otherBuffer); //返回一个数字,具体判断看下面的例子
var buffer1 = Buffer.from('ABC');
var buffer2 = Buffer.from('ABCD');
var result = buffer1.compare(buffer2);

if(result < 0){
    console.log(buffer1 + '在' + buffer + '之前')
}
else if(result == 0){
    console.log(buffer1 + '与' + buffer + '相同')
}
else{
    console.log(buffer1 + '在' + buffer + '之后')
}

//结果ABC在ABCD之前

拷贝缓冲区

buf.copy(targetBuffer,targetStart,sourceStart,sourceEnd)
//一些参数不填是有默认值的,比如第二第三个默认是0,第四个默认是buffer.length

var buf1 = Buffer.from('abcdefghijkl');
var buf2 = Buffer.from('RUNOOB');

buf2.copy(buf1,2);

console.log(buf1.toString());
//abRUNOOBijkl ,只是覆盖了,多出来的并没有怎么样

缓冲区裁剪

var buffer1 = Buffer.from('runoob');

var buffer2 = buffer.slice(0,2); //不包括2

console.log(buffer2); //ru

缓冲区长度

var buffer = Buffer.from('lam');

console.log(buffer.length);
//3

//基本就是英文字母的长度

猜你喜欢

转载自blog.csdn.net/JimmyLLLin/article/details/82226646