雖然知道了怎么實例化Buffer,但這還遠遠不夠,因為Buffer類使隨nodejs一起發布的核心庫,Buffer不僅能處理tcp連接中發送接收的數據,也能處理圖像或者是壓縮文件,甚至說文件系統里面的數據,包括網絡中二進制數據流,只要是nodejs中能處理的io操作中都可能用到buffer,那么具體要怎么用
要學會Buffer的使用,一部分是Buffer的實例化,一部分是實例化后buffer對象的處理,Buffer實例化上一節已經了解過了
Buffer靜態方法
Buffer { [Function: Buffer] poolSize: 8192, from: [Function], alloc: [Function], allocUnsafe: [Function], allocUnsafeSlow: [Function], isBuffer: [Function: isBuffer], compare: [Function: compare], isEncoding: [Function], concat: [Function], byteLength: [Function: byteLength], [Symbol(node.isEncoding)]: [Function] }
從上面可以看出Buffer是一個構造函數,同時他也是一個對象
poolSize:內存載體的容量 靜態方法isBuffer:判斷對象是否是Buffer類型對象,很多時候需要判斷數據類型,才會有對應后續的操作 compare:用來判斷兩個對象的相對位置,一般來做按字符串的排序 isEncoding:判斷nodejs是否支持某種編碼,像中文處理這種,只能使用utf-8這種編碼,對於gbk這種是無法解析的 concat:將幾個Buffer對象,鏈接創建一個新的buffer對象 bytelength:獲得指定編碼下字符串所占的字節數
Buffer實例方法
buffer.write(string,offset=0,length,encoding='utf8');
string:一定要傳的,也就是要寫入的字符串
offset:用來指定字符串轉化為字節數據后的寫入的位置
length:寫入的長度,
encoding:指定寫入字符串的編碼格式,默認是utf8
> var buf = new Buffer('hello every'); undefined > buf.length 11 > buf.write('hi every') 8 > buf.toString() 'hi everyery' > buf.length 11
這個長度依然是11,說明這個buffer在初始化的時候就已經被指定,無論你怎么去改,這個長度是不變的,這就是如果沒有傳offset的值的話,就是從第0為覆蓋掉之前的數據,
> buf.write(' everyeveryevery',2,16); 9 > buf.toString() 'hi everyev'
我們看到打印出來的還是11位數,然后從之前的第二位開始被覆蓋成新的字符串,知道11位,就不顯示了
buffer.copy(target,tStart,tStart,sEnd=buffer.length);
target:必須要傳的,用來指定復制的目標buffer
tStart:指定目標buffer對象中從第幾個字節開始寫,默認的值是0
tStart:用來指定原buffer里面獲取數據的開始位置,默認的值也是0
sEnd:指從復制源對象里面獲取數據的結束位置,默認值是buffer對象的長度
> var buf = new Buffer('hello every') undefined > buf.length 11 > var buf2 = new Buffer(5) undefined > buf.copy(buf2) 5 > buf2.toString() 'hello' > buf.toString() 'hello every'
buf2打印出來的數是hello,默認從0位開始,那傳上這個參數,從第6為開始,到第11位結束
> buf.copy(buf2,0,6,11) 5 > buf2.toString() 'every'