緩沖區(qū)解讀
我們主要聊聊以下幾個方面的問題:
什么是緩沖區(qū),用來做啥
如何創(chuàng)建緩沖區(qū)
訪問緩沖區(qū)
設(shè)置某個字節(jié)的數(shù)據(jù)
切分緩沖區(qū)
復(fù)制緩沖區(qū)
編碼和解碼二進制數(shù)據(jù)
好,看起來內(nèi)容有點多,其實很簡單,我們切入正題
緩沖區(qū)的概念
我們都知道JS非常的善于處理字符串,因此它并不善于處理二進制的數(shù)據(jù)。在js中沒有字節(jié)類型,也沒有結(jié)構(gòu)類型,也沒有字節(jié)數(shù)組類型,只有數(shù)值類型和字符串類型。
在服務(wù)器端,JS可以很容易處理http這樣的文本協(xié)議,但是我們知道服務(wù)端不僅做這些,可能會有數(shù)據(jù)庫通信,操作圖像,文件上傳。所以JS操作起來不是那么的容易,浪費資源,有很緩慢。因此Buffer就出現(xiàn)了,它作為node的一個核心模塊,專門來處理二進制數(shù)據(jù)。
要了解的buffer特點
Buffer偽類的數(shù)據(jù)占用并不是分配在JS的VM內(nèi)存堆中,也就是說Buffer對象不會被JS的垃圾收集算法處理,它占據(jù)的是一個不會被修改的永久內(nèi)存地址,這也避免了因緩沖區(qū)內(nèi)容的內(nèi)存復(fù)制而導(dǎo)致的CPU浪費。
創(chuàng)建緩沖區(qū)
緩沖區(qū)的創(chuàng)建方法很簡單,我們看一個例子:
//1. utf-8 constbuf =newBuffer('hello world');//默認的編碼方式//2.指定編碼方式constbuf1 =newBuffer('8b76fde713ce','base64');//3.創(chuàng)建指定長度的緩沖區(qū)constbuf2 =newBuffer(1024);//創(chuàng)建1024字節(jié)的緩沖區(qū)console.log(buf);//
訪問緩沖區(qū)和相關(guān)操作
//訪問緩沖區(qū)console.log(buf[2]);//buf 上第2個字節(jié)->108//初始化緩沖區(qū)中的數(shù)據(jù)并非0 而是一些隨機值 (書上)console.log(buf2[1]);//自己親測的時候是0 可能是我node版本的原因//設(shè)置某個字節(jié)上的數(shù)據(jù)buf2[1] =125;console.log(buf2[1]);// 125//獲取長度console.log(buf.length);// 11//軼代緩沖區(qū)內(nèi)容constbuf3 =newBuffer(100);for(vari =0;i
切分緩沖區(qū)
//切分緩沖區(qū)constbuf4 =newBuffer('nihao node js');constsmallerBuf = buf4.slice(8,12);console.log(smallerBuf.toString());//de j
需要知道的幾點:
1.沒有分配新的內(nèi)存,沒有進行任何復(fù)制
2.修改父緩沖區(qū)數(shù)據(jù)會影響到子緩沖區(qū)數(shù)據(jù)
3.其實是創(chuàng)建了子緩沖區(qū),父緩沖區(qū)操作結(jié)束后依然繼續(xù)被保留,不能被垃圾回? ? ? ? ? 收器回收,會導(dǎo)致內(nèi)存泄漏
4.可以用copy方法代替
復(fù)制緩沖區(qū)
//復(fù)制緩沖區(qū)constbuf5 =newBuffer(11);buf4.copy(buf5,0,8,19);console.log(buf5.toString());//de js
解碼和編碼
//解碼//1.解析成utf8字符串console.log(buf3.toString());//2.將uft8字符串解析成base64格式的console.log(smallerBuf.toString('base64'));//ZGUgag==