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對象並沒有受到影響