nodeJS入門-Buffer對象


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM