buffer是什麼?以下這篇文章帶大家深入了解一下Nodejs中的buffer模組,介紹一下創建、複製、拼接、截取、填充Buffer,以及Buffer與String相互轉換的方法,希望對大家有幫助!
我們知道,JS在對字串、陣列、數字、布林值等都有對應的方法API進行操作處理,而在Node中,還需要檔案操作、網路通訊、操作資料庫、資料傳輸等能力;文件在儲存層面都是以二進位形式表示,在http的請求和回應中資料的傳輸也是以二進位資料進行傳輸,所以僅僅目前的JS能力還是不夠的,也就在Node中提供了buffer模組。
即:使得NodeJS擁有像操作字串一樣來操作處理二進位資料的能力。 buffer也被稱為臨時性暫存區
,即暫時存放輸入和輸出二進位資料的一段記憶體。
在之前的文章聊聊Nodejs中的核心模組:stream流模組(看看如何使用)中,我們了解到在對大檔案進行讀取操作時候,一般不會一次全部讀取到記憶體中,而是以流的形式讀取一段資料塊,而連續的資料塊便形成了資料流的概念。而在對資料區塊讀取和寫入過程中,資料首先會儲存在buffer(臨時性暫存區)
的記憶體中,以待處理。
1.1 了解buffer記憶體分配
#buffer物件的記憶體分配並不是在V8的堆記憶體中,而是在Node的C 層面實現內存的申請;為了高效的使用申請來得內存,Node中採用slab分配機制(一種動態內存管理機制)。
1. 2 buffer的全局性
Node在進程啟動時buffer就已經加裝進入內存,並將其放入全局對象,使用時候可以無需require引入,但是官方但仍然建議透過import 或require 語句明確地引用它。
buffer實例除了可以在檔案讀取,http請求得到之外,還可以透過手動方式建構建立。
2.1 Buffer.alloc(size[, fill[, encoding]])
參數:
import { Buffer } from 'buffer'; const buf = Buffer.alloc(8); console.log(buf); // <Buffer 00 00 00 00 00 00 00 00>
2.2 Buffer.allocUnsafe(size)
參數:
import { Buffer } from 'buffer'; const buf = Buffer.allocUnsafe(8); console.log(buf); // <Buffer e8 bf 99 e6 98 af e4 b8 80 e6>
2.3 Buffer.from(string[, encoding])
建立包含傳入string的新buffer
參數:
import { Buffer } from 'buffer'; const buf = Buffer.from('hello buffer'); console.log(buf); // <Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 72>
2.4 Buffer.from(array)
使用 0
– 255
範圍內的位元組 array
指派新的Buffer
。
import { Buffer } from 'buffer'; const array = [0x62, 0x78, 0x84]; const buf = Buffer.from(array); console.log(buf); // <Buffer 62 78 84>
#3.1 Buffer.from(buffer)
#參數:
import { Buffer } from 'buffer'; // 新建 const buf1 = Buffer.alloc(10, 2); // 复制 const buf2 = Buffer.from(buf1); console.log(buf1); // <Buffer 02 02 02 02 02 02 02 02 02 02> console.log(buf2); // <Buffer 02 02 02 02 02 02 02 02 02 02>
3.2 buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]] )
將buf實例複製到target目標
import { Buffer } from 'buffer'; const buf1 = Buffer.alloc(10, 2); const buf2 = Buffer.allocUnsafe(10) // 将buf1复制到buf2 buf1.copy(buf2); console.log(buf1); // <Buffer 02 02 02 02 02 02 02 02 02 02> console.log(buf2); // <Buffer 02 02 02 02 02 02 02 02 02 02>
##4.1 Buffer.concat(list[, totalLength])
傳回list中所有buffer實例連接在一起的新buffer參數:注意:
import { Buffer } from 'buffer'; const buf1 = Buffer.alloc(4, 2); const buf2 = Buffer.alloc(4, 3); const buf3 = Buffer.concat([buf1, buf2]); console.log(buf1); // <Buffer 02 02 02 02> console.log(buf2); // <Buffer 03 03 03 03> console.log(buf3); // <Buffer 02 02 02 02 03 03 03 03>
#5.1 buf.slice([start[, end]])
從buf實例傳回新的Buffer實例,傳回的新Buffer實例只是來源buf實例的引用,也就是對新傳回的實例修改會影響原有的Buffer實例參數:import { Buffer } from 'buffer'; const buf1 = Buffer.alloc(10, 2); // 截取 const buf2 = buf1.slice(1,4); // 截取部分修改 buf2[0] = 0x63; console.log(buf1); // <Buffer 02 63 02 02 02 02 02 02 02 02> console.log(buf2); // <Buffer 63 02 02>
6.1 buf.fill(value[, offset[, end]][, encoding])
参数:
import { Buffer } from 'buffer'; const buf1 = Buffer.allocUnsafe(8).fill(2); console.log(buf1); // <Buffer 02 02 02 02 02 02 02 02>
6.2 buf.write(string[, offset[, length]][, encoding])
根据 encoding 中的字符编码将 string 写入 buf 的 offset 处。
注意
:length 参数是要写入的字节数。 如果 buf 没有足够的空间来容纳整个字符串,则只会写入 string 的一部分
参数:
import { Buffer } from 'buffer'; // buf1 length为12 const buf1 = Buffer.alloc(12, 3); // write offset大于buf1.length,写入无效 buf1.write('hello', 12); console.log(buf1); // <Buffer 03 03 03 03 03 03 03 03 03 03 03 03> // 部分写入 buf1.write('hello', 10); // <Buffer 03 03 03 03 03 03 03 03 03 03 68 65>
7.1 Buffer.isBuffer(obj)
检验传入obj是否为buffer
import { Buffer } from 'buffer'; const buf1 = Buffer.alloc(12, 3); console.log(Buffer.isBuffer(buf1)); // true
7.2 Buffer.isEncoding(encoding)
检查传入的编码名称是否被Buffer所支持
import { Buffer } from 'buffer'; console.log(Buffer.isEncoding('utf-8')) // true
Buffer转String
8.1 buf.toString([encoding[, start[, end]]])
参数:
import { Buffer } from 'buffer'; const buf1 = Buffer.allocUnsafe(26) for (let i = 0; i < 26; i++) { // 97 是 'a' 的十进制 ASCII 值。 buf1[i] = i + 97; } console.log(buf1.toString()) // abcdefghijklmnopqrstuvwxyz
String转Buffer
8.2 Buffer.from(string[, encoding])
参数:
import { Buffer } from 'buffer'; const buf = Buffer.from('hello buffer'); console.log(buf); // <Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 72>
9.1 与Array类似点
9.2 与Array不同之处
更多node相关知识,请访问:nodejs 教程!!
以上是buffer是什麼?深入了解Nodejs中的buffer模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!