Buffer是什么
Buffer代表一个缓冲区,主要用于操作二进制数据流,其用法与数组非常相似。
创建一个Buffer实例
使用new操作符,有四种方法创建一个Buffer实例:
- new Buffer(size),创建一个指定大小的buffer
- new Buffer(array),根据一个字节数组来创建一个buffer
- new Buffer(str[,encoding]),根据一个字符串和编码格式创建buffer,不指定编码时默认使用utf8
- new Buffer(buffer),根据buffer实例创建一个新的buffer
一、使用new Buffer(size)方式创建一个Buffer实例:
var buf=new Buffer(10); console.log(buf);
运行结果如下:
注意:
1、使用new Buffer(size)分配的缓冲区,是未初始化的。在那块内存空间里面什么都没有
二、使用new Buffer(array)方式创建一个Buffer实例:
var bf=new Buffer([1,2,3]); console.log(bf);
运行结果如下:
三、使用new Buffer(str[,encoding])方式创建一个Buffer实例:
var bf1=new Buffer('miao','utf-8'); console.log(bf1); for(var i=0;i<bf1.length;i++){ console.log(String.fromCharCode(bf1[i])); }
运行结果如下:
注意:一个Buffer对象的大小,在创建时就固定下来,创建之后不可改变,这个结论我们可以通过下面一个实例来说明:
var buf=new Buffer(5); buf[6]=5; console.log(buf)
分析以下运行结果,我们发现buffer对象的长度并没有改变
Buffer对象的方法
-
buf.write()方法
buf.write(string[, offset][, length][, encoding]) //往Buffer对象中写入数据
uf.write用来向缓冲区中写入一个字符串,返回实际写入的字节数。参数含义如下:
- string,待写入的字符串对象
- offset,缓冲区偏移量,指定的话就从这个位置开始写入,不指定就默认为0
- length,要写入的字节数
- encoding,代谢如字符串的编码格式,默认为utf8
实例:
var str='xiaoxu'; var bf=new Buffer(6); bf.write(str); //从字母i开始写入,一直到最后 console.log(bf); bf.write(str,1,5); //从字母i开始写入,一直写到第五位x console.log(bf);
运行结果:
-
buf.toString()方法
buf.toString([encoding], [start], [end]) // 根据 encoding参数(默认是 'utf8')返回一个解码的 string 类型
实例:
var bf=new Buffer("xiaoxu"); console.log(bf); console.log(bf.toString()); var bf2=new Buffer("小徐"); console.log(bf2); console.log(bf2.toString('utf-8',3));
如果不知道开始位置,则将字符全部返回,如果指定了开始位置和结束位置则按指定的返回,在上面实例中,因为一个中文占3个字节,所以在bf2这个实例中,我们指定从第三个位置开始,则返回的是徐这个汉字
运行结果:
-
buf.toJSON()
buf.toJSON() //返回一个 JSON表示的Buffer实例。JSON.stringify将会默认调用来字符串序列化这个Buffer实例
实例:
var bf=new Buffer("xiaoxu"); console.log(bf.toJSON());
运行结果:
-
buf.slice()方法
buf.slice([start], [end]) ://返回一个新的buffer,这个buffer将会和老的buffer引用相同的内存地址,注意:修改这个新的buffer实例slice切片,也会改变原来的buffer
实例:
var bf=new Buffer("xiaoxu"); console.log(bf); var bf2=bf.slice(2,4); console.log(bf2);
运行结果如下:
注意:在上述实例中,bf2跟bf引用的是同一块内存,所以当bf2中的内容改变的时候,bf中的内容也会受到改变,如下实例:
var bf=new Buffer("xiaoxu"); console.log(bf); var bf2=bf.slice(2,4); console.log(bf2) bf2[0]=2; console.log(bf2); console.log(bf);
运行结果如下:
在以上实例中,由于bf跟bf2引用的是同一块内存地址,所以当我们把bf2的第0位即61改成02的时候,bf中的61也变成了02
-
buf.copy()方法
buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd]) //进行buffer的拷贝
实例:
var bf=new Buffer('xiaoxu'); var bf4=new Buffer(10); bf.copy(bf4); console.log(bf4); bf4[5]=2; console.log(bf4); console.log(bf);
运行结果:
在上述实例中,我们可以发现,将bf对象中的内容拷贝到bf4对象中,然后我们改变bf4对象中的内容的时候,原来的bf对象并没有受到影响