Node.js快取

烏雲上發表於2018-09-03

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 與字元編碼

Buffer 例項一般用於表示編碼字元的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六進位制編碼的資料。 通過使用顯式的字元編碼,就可以在 Buffer 例項與普通的 JavaScript 字串之間進行相互轉換。

const buf = Buffer.from(`runoob`, `ascii`);

// 輸出 72756e6f6f62
console.log(buf.toString(`hex`));

// 輸出 cnVub29i
console.log(buf.toString(`base64`));

  

Node.js 目前支援的字元編碼包括:

  • ascii – 僅支援 7 位 ASCII 資料。如果設定去掉高位的話,這種編碼是非常快的。

  • utf8 – 多位元組編碼的 Unicode 字元。許多網頁和其他文件格式都使用 UTF-8 。

  • utf16le – 2 或 4 個位元組,小位元組序編碼的 Unicode 字元。支援代理對(U+10000 至 U+10FFFF)。

  • ucs2 – utf16le 的別名。

  • base64 – Base64 編碼。

  • latin1 – 一種把 Buffer 編碼成一位元組編碼的字串的方式。

  • binary – latin1 的別名。

  • hex – 將每個位元組編碼為兩個十六進位制字元。

 

將 Buffer 轉換為 JSON 物件

語法

將 Node Buffer 轉換為 JSON 物件的函式語法格式如下:

buf.toJSON()

當字串化一個 Buffer 例項時,JSON.stringify() 會隱式地呼叫該 toJSON()。

返回值

返回 JSON 物件。

例項

const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);

// 輸出: {"type":"Buffer","data":[1,2,3,4,5]}
console.log(json);

const copy = JSON.parse(json, (key, value) => {
  return value && value.type === `Buffer` ?
    Buffer.from(value.data) :
    value;
});

// 輸出: <Buffer 01 02 03 04 05>
console.log(copy);

  

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

{"type":"Buffer","data":[1,2,3,4,5]}
<Buffer 01 02 03 04 05>

  

緩衝區裁剪

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

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

引數

引數描述如下:

  • start – 數字, 可選, 預設: 0

  • end – 數字, 可選, 預設: buffer.length

返回值

返回一個新的緩衝區,它和舊緩衝區指向同一塊記憶體,但是從索引 start 到 end 的位置剪下。

例項

var buffer1 = Buffer.from(`runoob`);
// 剪下緩衝區
var buffer2 = buffer1.slice(0,2);
console.log("buffer2 content: " + buffer2.toString());

  

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

buffer2 content: ru

  

裁剪功能返回的實際是原始快取區 buffer 或者一部分,操作的是與原始 buffer 同一塊記憶體區域。

// 裁剪
var buffer_origin = Buffer.from(`runoob`);
var buffer_slice = buffer_origin.slice(0,2);
console.log("buffer slice content: "+buffer_slice.toString());
console.log("buffer origin content: "+buffer_origin.toString());
buffer_slice.write("wirte"); // Write buffer slice

// 裁剪前與原始字串的改變
console.log("buffer slice content: "+buffer_slice.toString());
console.log("buffer origin content: "+buffer_origin.toString());

  

輸出:

buffer slice content: ru
buffer origin content: runoob
buffer slice content: wi
buffer origin content: winoob

  

可以看到對裁剪返回的 buffer 進行寫操作同時,也對原始 buffer 進行了寫操作。

摘自:http://www.runoob.com/nodejs/nodejs-buffer.html



相關文章