亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

NodeJS中Buffer模塊詳解

2019-11-20 13:28:30
字體:
來源:轉載
供稿:網友

一,開篇分析

所謂緩沖區Buffer,就是 "臨時存貯區" 的意思,是暫時存放輸入輸出數據的一段內存。

JS語言自身只有字符串數據類型,沒有二進制數據類型,因此NodeJS提供了一個與String對等的全局構造函數Buffer來提供對二進制數據的操作。除了可以讀取文件得到Buffer的實例外,還能夠直接構造,例如:

復制代碼 代碼如下:

 var buffer = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]) ;

Buffer與字符串類似,除了可以用.length屬性得到字節長度外,還可以用[index]方式讀取指定位置的字節,例如:

復制代碼 代碼如下:

buffer[0] ; // 0x68;

Buffer與字符串能夠互相轉化,例如可以使用指定編碼將二進制數據轉化為字符串:

復制代碼 代碼如下:

var str = buffer.toString("utf-8");  // hello

將字符串轉換為指定編碼下的二進制數據:

復制代碼 代碼如下:

var buffer= new Buffer("hello", "utf-8") ; // <Buffer 68 65 6c 6c 6f>

一點兒區別:

Buffer與字符串有一個重要區別。字符串是只讀的,并且對字符串的任何修改得到的都是一個新字符串,原字符串保持不變。

至于Buffer,更像是可以做指針操作的C語言數組。例如,可以用[index]方式直接修改某個位置的字節。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

slice方法也不是返回一個新的Buffer,而更像是返回了指向原Buffer中間的某個位置的指針,如下所示。

[ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]
    ^           ^
    |           |
   bin     bin.slice(2)
因此對slice方法返回的Buffer的修改會作用于原Buffer,例如:

復制代碼 代碼如下:

 var buffer= new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]) ;
 var sub = bin.slice(2) ;
 sub[0] = 0x65 ;
 console.log(buffer) ; //  <Buffer 68 65 65 6c 6f>

如果想要拷貝一份Buffer,得首先創建一個新的Buffer,并通過.copy方法把原Buffer中的數據復制過去。

這個類似于申請一塊新的內存,并把已有內存中的數據復制過去。以下是一個例子。

復制代碼 代碼如下:

 var buffer= new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]) ;
 var dup = new Buffer(bin.length) ;
 buffer.copy(dup) ;
 dup[0] = 0x48 ;
 console.log(buffer) ;  // <Buffer 68 65 6c 6c 6f>
 console.log(dup) ;  // <Buffer 48 65 65 6c 6f>

總之,Buffer將JS的數據處理能力從字符串擴展到了任意二進制數據。

以上簡單讓大家了解一下什么是Buffer,下面具體說說如何使用和具體使用場景。

二,聊聊Buffer

JavaScript對字符串處理十分友好,無論是寬字節還是單字節字符串,都被認為是一個字符串。Node中需要處理網絡協議、操作數據庫、處理圖片、文件上傳等,還需要處理大量二進制數據,自帶的字符串遠不能滿足這些要求,因此Buffer應運而生。

Buffer結構

Buffer是一個典型的Javascript和C++結合的模塊,性能相關部分用C++實現,非性能相關部分用javascript實現。

Node在進程啟動時Buffer就已經加裝進入內存,并將其放入全局對象,因此無需require

Buffer對象:類似于數組,其元素是16進制的兩位數。

Buffer內存分配

Buffer對象的內存分配不是在V8的堆內存中,在Node的C++層面實現內存的申請。

為了高效的使用申請來得內存,Node中采用slab分配機制,slab是一種動態內存管理機制,應用各種*nix操作系統。slab有三種狀態:

(1) full:完全分配狀態

(2) partial:部分分配狀態

(3) empty:沒有被分配狀態

Buffer的轉換
 
Buffer對象可以和字符串相互轉換,支持的編碼類型如下:

ASCII、UTF-8、UTF-16LE/UCS-2、Base64、Binary、Hex

字符串轉Buffer

new Buffer(str, [encoding]),默認UTF-8
buf.write(string, [offset], [length], [encoding])

Buffer轉字符串

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

Buffer不支持的編碼類型

通過Buffer.isEncoding(encoding)判斷是否支持

iconv-lite:純JavaScript實現,更輕量,性能更好無需C++到javascript的轉換

iconv:調用C++的libiconv庫完成

Buffer的拼接

注意 "res.on('data', function(chunk) {})",其中的參數chunk是Buffer對象,直接用+拼接會自動轉換為字符串,對于寬字節字符可能會導致亂碼產生,

解決方法:

(1) 通過可讀流中的setEncoding()方法,該方法可以讓data事件傳遞不再是Buffer對象,而是編碼后的字符串,其內部使用了StringEncoder模塊。

(2) 將Buffer對象暫存到數組中,最后在組裝成一個大Buffer讓后編碼轉換為字符串輸出。

Buffer在文件I/O和網絡I/O中廣泛應用,其性能舉足輕重,比普通字符串性能要高出很多。

Buffer的使用除了與字符串的轉換有性能損耗外,在文件讀取時候,有一個highWaterMark設置對性能影響至關重要。

a,highWaterMark設置對Buffer內存的分配和使用有一定影響。

b, highWaterMark設置過小,可能導致系統調用次數過多。

什么時候該用buffer,什么時候不該用  ------ 純粹的javascript支持unicode碼而對二進制不是很支持,當解決TCP流或者文件流的時候,處理流是有必要的,我們保存非utf-8字符串,2進制等等其他格式的時候,我們就必須得使用 ”Buffer“ 。

三,實例引入

復制代碼 代碼如下:

 var buf = new Buffer("this is text concat test !") ,str = "this is text concat test !" ;
 console.time("buffer concat test !");
 var list = [] ;
 var len = 100000 * buf.length ;
 for(var i=0;i<100000;i++){
     list.push(buf) ;
     len += buf.length ;
 }
 var s1 = Buffer.concat(list, len).toString() ;
 console.timeEnd("buffer concat test !") ;
 console.time("string concat test !") ;
 var list = [] ;
 for (var i = 100000; i >= 0; i--) {
   list.push(str) ;
 }
 var s2 = list.join("") ;
 console.timeEnd("string concat test !") ;

以下是運行結果:

讀取速度肯定string更快,buffer還需要toString()的操作。 所以我們在保存字符串的時候,該用string還是要用string,就算大字符串拼接string的速度也不會比buffer慢。

那什么時候我們又需要用buffer呢?沒辦法的時候,當我們保存非utf-8字符串,2進制等等其他格式的時候,我們就必須得使用了。

四,總結一下

(1),JavaScript適合處理Unicode編碼數據,但對二進制數據的處理并不友好。
(2),所以處理TCP流或文件系統時,對八位字節流的處理很有必要。
(3),Node有幾個用于處理,創建和消耗八位字節流的方法。
(4),原始數據存放在一個Buffer實例中,一個Buffer類似一個整數數組,但是它的內存,分配在V8堆棧外。一個Buffer的大小是不能更改的。
(5),處理的編碼類型有:ascii,utf8,utf16le,ucs2(utf16le的別名),base64,binary,hex。
(6),Buffer為全局元素,直接new Buffer()就得到一個Buffer實例。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产免费av| 久久精品久久久久| 国产97在线|亚洲| 国产精品免费久久久| 欧美午夜精品久久久久久久| 91亚洲国产精品| 美女扒开尿口让男人操亚洲视频网站| 第一福利永久视频精品| 一区二区三区视频在线| 亚洲精品美女网站| 97在线日本国产| 日韩av影片在线观看| 欧美成人精品在线播放| 精品在线小视频| 欧美在线视频观看免费网站| 欧美成aaa人片在线观看蜜臀| 亚洲黄色片网站| 国产精品扒开腿爽爽爽视频| 九九九久久国产免费| 欧美日韩国产成人高清视频| 欧美精品生活片| 国产精品丝袜久久久久久高清| 激情av一区二区| 国产欧美一区二区三区四区| 国产日韩精品在线观看| 欧美野外猛男的大粗鳮| 国产成人在线视频| 国产女人18毛片水18精品| 九九热最新视频//这里只有精品| 国产成人精品久久二区二区| 欧美中文字幕第一页| 色偷偷888欧美精品久久久| 国产一区二区黑人欧美xxxx| 国产日韩中文字幕| 欧美一级电影免费在线观看| 亚洲偷欧美偷国内偷| 精品无人区乱码1区2区3区在线| 夜夜嗨av一区二区三区免费区| 国产精品免费看久久久香蕉| 欧美三级免费观看| 国产精品久久久久久久久久尿| 中文字幕av一区中文字幕天堂| 久久国产精品久久久久| 亚洲欧洲视频在线| 欧美一区二区三区免费视| 日韩精品视频免费专区在线播放| 97超碰国产精品女人人人爽| 久久国产精品视频| 色综合天天狠天天透天天伊人| 91久久久在线| 久久夜色精品国产| 国产精品久久网| 久久天堂电影网| 69av在线视频| 久久精品视频导航| 狠狠色噜噜狠狠狠狠97| 亚洲国产精品热久久| 亚洲视频一区二区| 最新91在线视频| 国产日韩在线精品av| 麻豆一区二区在线观看| 色哟哟网站入口亚洲精品| 久久影院中文字幕| 欧美丰满少妇xxxx| 成人激情在线播放| 欧美一级电影在线| 欧美性20hd另类| 97视频在线观看亚洲| 午夜精品久久17c| 欧美在线视频免费播放| 国产精品精品视频| 亚洲激情视频在线播放| 国产精品揄拍一区二区| 久久久久久久97| 国产精品高潮呻吟视频| 18一19gay欧美视频网站| 欧美中文在线观看国产| 亚洲第一福利视频| 日本久久久久久久久| 91国产精品91| 欧美激情a∨在线视频播放| 日本电影亚洲天堂| 国产精品久久久久久久一区探花| 日韩的一区二区| 成人国产精品久久久| 欧美做受高潮电影o| 日韩精品中文字幕在线播放| 欧美国产第二页| 中文字幕精品av| 欧美日韩性视频在线| 日韩精品在线免费观看视频| 亚洲va码欧洲m码| 日韩大陆欧美高清视频区| 国产在线98福利播放视频| 国产精品亚洲аv天堂网| 全球成人中文在线| 国产精品女人久久久久久| 成人午夜在线观看| 国产精品电影在线观看| 91chinesevideo永久地址| 欧美性xxxx极品高清hd直播| 欧美精品免费播放| 日韩大胆人体377p| www国产亚洲精品久久网站| 色偷偷偷亚洲综合网另类| 亚洲跨种族黑人xxx| 欧美刺激性大交免费视频| 欧美精品在线看| 欧洲成人免费aa| 91麻豆国产精品| 亚洲性猛交xxxxwww| 操人视频在线观看欧美| 国产精品黄色av| 日韩在线观看免费网站| 国产日韩欧美在线播放| 欧美视频在线免费看| 欧美亚洲午夜视频在线观看| 国产成人欧美在线观看| 日韩成人在线电影网| 国产精品一区电影| 国产精品午夜国产小视频| 91av视频导航| 亚洲第一av网站| 色婷婷av一区二区三区在线观看| 亚洲另类图片色| 国产福利精品在线| 日韩在线免费高清视频| 精品久久久久久电影| 一区二区欧美激情| 国产日韩中文在线| 538国产精品视频一区二区| 日韩中文字幕av| 国产日韩在线看| 久久影视电视剧凤归四时歌| 国产精品91久久| 在线色欧美三级视频| 亚洲成人国产精品| 国产精品手机播放| 久久精品国产电影| 日韩av中文字幕在线播放| 亚洲欧洲视频在线| 亚洲精品第一国产综合精品| 欧美在线一级视频| 欧美猛交ⅹxxx乱大交视频| 国产视频福利一区| 97福利一区二区| 九九九热精品免费视频观看网站| 亚洲最大av在线| 国内揄拍国内精品少妇国语| 欧美激情一区二区久久久| 久久久噜久噜久久综合| 欧美午夜精品伦理| 国产精品欧美日韩| 欧美激情一区二区三区高清视频| 久久久在线观看| 91av视频在线免费观看| 久久电影一区二区| 日韩亚洲综合在线| 成人做爽爽免费视频| 亚洲iv一区二区三区| 欧美午夜电影在线| 亚洲精品久久7777777| 日韩一区视频在线| 亚洲欧美日韩国产中文专区|