node.js中緩衝區–Buffer

markfork發表於2016-08-29

Node.js中Buffer簡介:


JavaScript 語言自身只有字串資料型別,沒有二進位制資料型別。
但在處理像TCP流或檔案流時,必須使用到二進位制資料。因此在 Node.js中,定義了一個 Buffer 類,該類用來建立一個專門存放二進位制資料的快取區。
在 Node.js 中,Buffer 類是隨 Node 核心一起釋出的核心庫。Buffer 庫為 Node.js 帶來了一種儲存原始資料的方法,可以讓 Node.js 處理二進位制資料,每當需要在 Node.js 中處理I/O操作中移動的資料時,就有可能使用 Buffer 庫。原始資料儲存在 Buffer 類的例項中。一個 Buffer 類似於一個整數陣列,但它對應於 V8 堆記憶體之外的一塊原始記憶體。

Buffer常用API


/*1.Node.js中Buffer是一個典型的javascript與c++結合的模組,它將效能相關的部分用              c++實現,將非效能的部分用javascript實現。 
  2.純javascript對字元友好但是i無法很好的處理二進位制資料,在java與node中buffer中存 儲的是二進位制資料。當我們面對TCP流或者檔案系統時,是需要處理八位流的,因此在Node.js中定義了一個Buffer類,該類用來建立一個專門的存放二進位制資料的緩衝區。 
  3.程式碼演示:*///buffer的建立,一共有三種建立方式:從不同維度進行建立,1建立長度為n的buffer例項,建立陣列為arr的buffer例項,建立字串str的buffer例項
 //<1建立buffer例項
   var buff;
 //buff = new Buffer(n);//建立長度為n的Buffer例項
 //buff = new Buffer(arr);//建立陣列為arr的buffer例項
 //buff = new Buffer(str,encoding);//建立字串Str的Buffer例項
   buff = new Buffer(10);
   buff = new Buffer([10,20,30,40,50]);
   buff = new Buffer("www.funoob.com","utf-8");
//<2寫入緩衝區
   buff = new Buffer(256);
   len = buff.write("www.runoob.com");
   console.log("寫入位元組數為:"+ len);
//<3從緩衝區中讀資料buf = new Buffer(26);
for(var i = 0 ; i < 26 ; i++) {    
    buf[i]=+97;
}
console.log(buf.toString(`ascii`));
console.log(buf.toString(`ascii`,0,5));//截前不截後
console.log(buf.toString(`utf8`,0,5));
console.log(buf.toString(undefined,0,5));//使用utf8編碼,並輸出abcde
//<4將Buffer轉換為json物件,語法如下:buf.toJson()
var buf = new Buffer("www.runoob.com");
var json = buf.toJSON(buf);
console.log(json);
var buf = new Buffer(`我愛 node.js`);
var json = buf.toJSON(buf);
console.log(json);
//<5 緩衝區合併
var buffer1 = new Buffer(`菜鳥教程`);
var buffer2 = new Buffer(`www.runoob.com`);
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("buffer3 的內容是: "+buffer3.toString());
//<6 緩衝區比較
/*  Node Buffer 比較的函式如下所示 
    buf.compare(otherBuffer)*/
var buff1 = new Buffer(`ABC`);
var buff2 = new Buffer(`ABCD`);
var result = buff1.compare(buff2);
if(result < 0) {   
    console.log(buff1 + "在" + buff2 + "之前");
}else if(result == 0) { 
    console.log(buff1 + "在" + buff2 + "相同");
}else {   
    console.log(buff1 + "在" + buff2 + "之後");
}
//<7 拷貝緩衝區
/*  語法為 buf.copy(targetBuffer) 將呼叫copy方法
    的緩衝區中內容拷貝到targetBuffer中
*/
var buffer1 = new Buffer(`ABC`);
var buffer2 = new Buffer(3);
buffer1.copy(buffer2);
console.log("buffer2`s content is : "+ buffer2.toString());
//<8 緩衝區裁剪
var buffer1 = new Buffer(`runoob`);
var buffer2 = buffer1.slice(0,2);//裁剪是包前不包後end索引指向的元素並不被包含在裁剪之後的內容當中
console.log("buffer2`s content is : "+buffer2.toString());
//<9 緩衝區長度
/*緩衝區長度計算語法如下所示: 
  buf.length; 
  返回值:  返回buffer物件所佔據的記憶體長度
*/
var buffer = new Buffer(`我愛 www.runoob.com `);
var len = buffer.length;//計算的是buff中位元組的個數,而非傳統的java中length的字元長度
console.log("buffer`s length is : "+len);

注意:以上程式碼可以直接拷貝至node.js檔案當中

執行結果

$ node buff.js
寫入位元組數為:14
abcdefghijklmnopqrstuvwxyz
abcde
abcde
abcde
{ type: `Buffer`,
  data: [ 119, 119, 119, 46, 114, 117, 110, 111, 111, 98, 46, 99, 111, 109 ] }
{ type: `Buffer`,
  data: [ 230, 136, 145, 231, 136, 177, 32, 110, 111, 100, 101, 46, 106, 115 ] }

buffer3 的內容是: 菜鳥教程www.runoob.com
ABC在ABCD之前
buffer2`s content is : ABC
buffer2`s content is : ru
buffer`s length is : 22

完。

部落格搬家:大坤的個人部落格
歡迎評論哦~


相關文章