Node.jsBuffer(緩沖區)

Node.jsBuffer(緩沖區),JavaScript 語言自身隻有字符串數據類型,沒有二進制數據類型。但在處理像TCP流或文件流時,必須使用到二進制數據。因此在 Node.js中,定義瞭一個 Buffer 類,該類用來創建一個專門存放二進制數據的緩存區。在 Node.js 中,Buffer 類是隨 Node 內核一起發佈的核心庫。Buffer 庫為 Node.js帶來瞭一種存儲原始數據的方法,可以讓 Node.js 處理二進制數據,每當需要在 Node.js 中處理I/O操作中移動的數據時,就有可能使用 Buffer 庫。原始數據存儲在 Buffer 類的實例中。一個 Buffer 類似於一個整數數組,但它對應於 V8 堆內存之外的一塊原始內存。

1、創建 Buffer類

Node Buffer 類可以通過多種方式來創建。

方法 1

創建長度為 10 字節的 Buffer 實例:

      var buf = new Buffer(10);

方法 2

通過給定的數組創建 Buffer 實例:

var buf = new Buffer([10, 20, 30, 40, 50]);

方法 3

通過一個字符串來創建 Buffer 實例:

var buf = new Buffer("www.runoob.com", "utf-8");

utf-8 是默認的編碼方式,此外它同樣支持以下編碼:"ascii", "utf8", "utf16le", "ucs2", "base64" 和 "hex"。

2、寫入緩沖區

寫入 Node 緩沖區的語法如下所示:

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

string – 寫入緩沖區的字符串。

offset – 緩沖區開始寫入的索引值,默認為 0 。

length – 寫入的字節數,默認為 buffer.length

encoding – 使用的編碼。默認為 'utf8' 。

返回值:返回實際寫入的大小。如果 buffer 空間不足, 則隻會寫入部分字符串。

實例:

//創建長度為256字節的Buffer實例
var buf = new Buffer(256);
//返回實際寫入的大小
console.log("寫入字符串:大傢好!我是山水子農,正在學習Node.js Buffer(緩存區)!")
var len = buf.write("大傢好!我是山水子農,正在學習Node.js Buffer(緩存區)!","utf-8");
console.log("寫入字節數 : "+  len);

執行以上代碼,輸出結果為:

3、從緩沖區讀取數據

讀取 Node 緩沖區數據的語法如下所示:

buf.toString([encoding[, start[, end]]])

encoding – 使用的編碼。默認為 'utf8' 。

start – 指定開始讀取的索引位置,默認為 0。

end – 結束位置,默認為緩沖區的末尾。

返回值:解碼緩沖區數據並使用指定的編碼返回字符串。

實例:

console.log("----------------------方法一----------------------");
//通過一個字符串來創建 Buffer 實例
var buf = new Buffer("大傢好!我是山水子農,正在學習Node.js Buffer(緩存區)!","utf-8");
console.log("讀取數據:"+buf.toString("utf-8"));  
console.log();  
console.log("----------------------方法二----------------------");
//創建長度為256字節的Buffer實例
var buf1= new Buffer(256);
//返回實際寫入的大小
var len=buf1.write("大傢好!我是山水子農,正在學習Node.js Buffer(緩存區)!","utf-8");
console.log("讀取數據:"+buf1.toString("utf-8"));
console.log();  
console.log("方法二輸出的結果字符串後面有亂碼,這是因為字符串長度小於256");
console.log();  
console.log("---------------------方法三----------------------");
//創建長度為len字節的Buffer實例
var buf2= new Buffer(len);
buf2.write("大傢好!我是山水子農,正在學習Node.js Buffer(緩存區)!","utf-8");
console.log("讀取數據:"+buf2.toString("utf-8"));
console.log();  
console.log("方法三可以正常的輸出字符串,這是因為字符串長度與緩存區的大小相同");

執行以上代碼,輸出結果為:

4、將 Buffer 轉換為 JSON 對象

將 Node Buffer 轉換為 JSON 對象的函數語法格式如下:

buf.toJSON()

返回值:返回 JSON 對象。

實例:

//通過一個字符串來創建 Buffer 實例
var buf = new Buffer("abcdefghi","utf-8");
//將 Node Buffer 轉換為 JSON 對象
var json = buf.toJSON(buf);
console.log(json);

執行以上代碼,輸出結果為:

5、緩沖區合並

Node 緩沖區合並的語法如下所示:

Buffer.concat(list[, totalLength])

list – 用於合並的 Buffer 對象數組列表。

totalLength – 指定合並後Buffer對象的總長度。

返回值:返回一個多個成員合並的新 Buffer 對象。

實例:

//第一個Buffer 實例
var buf1= new Buffer("大傢好!我是山水子農,","utf-8");
//第二個Buffer 實例
var buf2 = new Buffer("這是緩沖區合並實例","utf-8");
var buf3 = Buffer.concat([buf1,buf2]);
console.log("緩沖區合並後內容: " + buf3.toString());
var buf4 = Buffer.concat([buf1,buf2],45);
console.log("緩沖區合並後內容: " + buf4.toString());

執行以上代碼,輸出結果為:

6、緩沖區比較

Node Buffer 比較的函數語法如下所示, 該方法在 Node.js v0.12.2 版本引入:

buf.compare(otherBuffer);

otherBuffer – 與 buf 對象比較的另外一個 Buffer 對象。

返回值:返回一個數字,表示 buf 在 otherBuffer 之前,之後或相同。

實例:

//第一個Buffer 實例
var buf1= new Buffer("大傢好!我是山水子農","utf-8");
//第二個Buffer 實例
var buf2 = new Buffer("這是緩沖區比較實例","utf-8");
var result = buf1.compare(buf2);
if(result < 0) {
   console.log("☆" +buf1 + "☆ 在 ☆" + buf2 + "☆ 之前");
}else if(result == 0){  
   console.log("☆" +buf1 + "☆ 與 ☆" + buf2 + "☆ 相同");
}else {
   console.log("☆" +buf1 + "☆ 在 ☆" + buf2 + "☆ 之後");
}

執行以上代碼,輸出結果為:

7、拷貝緩沖區

Node 緩沖區拷貝語法如下所示:

buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])

targetBuffer – 要拷貝的 Buffer 對象。

targetStart – 數字, 可選, 默認: 0

sourceStart – 數字, 可選, 默認: 0

sourceEnd – 數字, 可選, 默認: buffer.length

返回值:沒有返回值。

//第一個Buffer 實例
var buf1= new Buffer("大傢好!我是山水子農","utf-8");
// 拷貝一個緩沖區
var buf2 = new Buffer(20);
buf1.copy(buf2);
console.log("buf2 content: " + buf2);

8、緩沖區裁剪

Node 緩沖區裁剪語法如下所示:

buf.slice([start[, end]])

start – 數字, 可選, 默認: 0

end – 數字, 可選, 默認: buffer.length

返回值:返回一個新的緩沖區,它和舊緩沖區指向同一塊內存,但是從索引 start 到 end 的位置剪切。

實例:

//第一個Buffer 實例
var buf1= new Buffer("大傢好!我是山水子農","utf-8");
// 剪切緩沖區
var buf2=buf1.slice(0,22);
console.log("buf2 content: " + buf2);

9、緩沖區長度

Node 緩沖區長度計算語法如下所示:

buf.length;

返回值:返回 Buffer 對象所占據的內存長度。

實例:

//第一個Buffer 實例
var buf1= new Buffer("大傢好!我是山水子農","utf-8");
//  緩沖區長度
console.log("buf1 length: " + buf1.length);

發佈留言