node MySQL buffer_node.js中buffer方法使用说明
熟悉JavaScript的童鞋應該對Node.js都不陌生,沒錯Node.js是一個基于Chrome?JavaScript運行時建立的平臺,用于方便地搭建響應速度快、易于擴展的網絡應用。Node.js?使用事件驅動,?非阻塞I/O?模型而得以輕量和高效,非常適合在分布式設備上運行數據密集型的實時應用。
正是由于Node.js的這些特性使得其在如今的編程中越來越受歡迎,對于新手程序猿來說很有必要掌握Node.js技術。本文小編就將為大家介紹Node.js中Buffer類的使用,希望對大家學習Node.js有幫助吧。
其實,Buffer類在Node.js的使用中,經常會用到,特別是在用Node.js做服務端開發時,http、tcp、udp、文件io等等類型的操作,都離不開Buffer類。
Buffer是什么
Buffer代表一個緩沖區,存儲二進制數據,是字節流,在網絡傳輸時,就傳輸的這種字節流。
編碼格式
雖然一般的字符串是有編碼格式的,比如UTF-8。但Buffer是沒有編碼格式的。兩者可以相互轉換,轉換時必須指定編碼格式。
在http模塊中,http.createServer方法需要的回調函數的原型是:
function?(req,?res)
這個回調的第一個參數,req,類型是http.IncomingMessage,而http.IncomingMessage是一個只讀的流,實現了Readable接口,stream.Readable讀到的數據(監聽data事件可以處理),就是Buffer對象,是字節流。而我們在程序中使用時,經常是要轉換為String。反過來,res(類型http.ServerResponse,可寫的流,實現了Writable接口)有個方法setDefaultEncoding,用來設置流的編碼格式,在write數據時,會使用指定的編碼格式來編碼數據,然后發送給客戶端。
這就是說,網絡傳輸的是Buffer,程序需要處理String,Buffer和String之間可以轉換。Buffer有toString方法,可以按指定的編碼格式將字節流轉換為String。
在文件系統模塊中,fs.createWriteStream和fs.createReadStream兩個方法都有一個可選參數options,可以指定defaultEncoding,這里指定的編碼格式,也是用于在Buffer和String之間轉換的。
目前我們在Node.js里,Buffer在轉換為字符串時,toString方法的第一個參數就是編碼類型,支持常見的編碼格式:
utf8,多字節編碼的Unicode字符,大多數文檔和網頁采用這種編碼格式
ascii,8bit編碼,一個字符占1個字節
utf16le,小端編碼的unicode字符
utf16be,大端編碼的unicode
ucs2,unicode編碼,每個字符占兩個字節
base64,Base-64字符串編碼
hex,每個字節編碼為兩個十六進制字符
假如你不確認某個編碼格式是否正確,可以使用Buffer.isEncoding(encoding)方法來測試。
在使用Buffer的toString方法時,如果你不指定編碼格式,則默認使用utf8來轉換。toString原型:
buf.toString([encoding][,?start][,?end])
第一個參數是編碼格式,第二個是開始位置(0到buf.length-1),第三個是結束位置(不包含這個索引位置的數據)。
創建一個Buffer實例
對于Buffer實例的創建,使用new操作符,有四種方法可實現:
new?Buffer(size),創建一個指buffer定大小的buffer
new?Buffer(array),根據一個字節數組來創建一個buffer
new?Buffer(str[,encoding]),根據一個字符串和編碼格式創建buffer,不指定編碼時默認使用utf8
new?Buffer(buffer),根據buffer實例創建一個新的buffer
比如下面的代碼可以創建Buffer的實例:
var?buf1?=?new?Buffer(256);
var?buf2?=?new?Buffer("Hello?Buffer");
var?buf3?=?new?Buffer([0x65,0x66,0x67]);
var?buf4?=?new?Buffer(buf2);
但有一點需要說明的是,使用new?Buffer(size)分配的緩沖區,是未初始化的。那塊內存里,可能什么都有。試試下面的代碼:
var?buf1?=?new?Buffer(256);
buf1.write('abc');
console.log("buf1\'s?content:?",?buf1.toString());
上面的代碼企圖使用toString轉換Buffer,可是你會看到控制臺輸出了很多亂碼……修改一下,使用buf.fill()方法填充一下就好了:
var?buf1?=?new?Buffer(256);
buf1.fill(0);
buf1.write('abc');
console.log("buf1\'s?content:?",?buf1.toString());
字符串是“\0”結尾的,調用了buf1.fill(0)之后,就一切安好。
往緩沖區寫數據
前面我們已經使用了buf.write方法來向緩沖區里寫入數據了。write的原型如下:
buf.write(string[,?offset][,?length][,?encoding])
buf.write用來向緩沖區中寫入一個字符串,返回實際寫入的字節數。參數含義如下:
string,待寫入的字符串對象
offset,緩沖區偏移量,指定的話就從這個位置開始寫入,不指定就默認為0
length,要寫入的字節數
encoding,代謝如字符串的編碼格式,默認為utf8
Buffer還有很多其他的方法,讓你操作緩沖區。比如writeUInt8、writeUInt16LE、writeUInt16BE、writeUInt31LE、writeUInt32BE、writeInt8、writeInt16LE、writeInt32LE等等。
LE?-?little?endian,小端字節序。
BE?-?big?endian,大端字節序,即網絡字節序。
需要說明的是,writeX方法,不像文件一樣自動為你保存當前位置,你不指定offset,它就總是從0位置開始寫。
從緩沖區讀數據
buf.toString其實是一種讀數據的方式。當然,還有其它的,比如buf[index]可以根據下標讀取字節,buf.readIntXXX,buf.readUIntXXX……
buf.toJSON()可以把一個Buffer對象轉換為JSON格式。當你針對一個Buffer對象調用JSON.stringify方法時,buf.toJSON()就會被調用。比如:
var?buf?=?new?Buffer('test');
var?json?=?JSON.stringify(buf);
console.log(json);
//?'{"type":"Buffer","data":[116,101,115,116]}'
緩沖區的長度
一個Buffer對象的大小,在創建時就固定下來,創建之后不可改變。如果你覺得Buffer里保存的是字符串時,不妨可以試試下面的代碼有助于理解這一點:
var?buf1?=?new?Buffer(256);
buf1.fill(0);
buf1.write('abc');
console.log("buf1\'s?length?-?%d,?not?3\n",?buf1.length);
buf1.write('abcdef');
console.log("buf1\'s?length?-?%d,?not?6\n",?buf1.length);
另外當你要從確定字符串在緩沖區中占用的字節長度時,不能使用字符串的length屬性,因為String.length返回的是字符長度。而對于采用UTF8等編碼格式編碼的字符串,一個字符可能占用多個字節。所以,String.length所代表的字符串長度和字節長度就不一致。注意,Buffer.length返回的是緩沖區的字節長度,而且是創建時的那個長度,不會隨著緩沖內容變化而變化。
如果要想衡量一個字符串占用的字節長度,可以使用Buffer.byteLength(string[,encoding])這個方法,它會測量一個字符串在指定編碼格式下占用的字節長度。具體的,可以看看下面這個例子:
var?name?=?new?String('who?is?\u5F20\u4E09\u4E30?');
console.log('name.length?=?%d',?name.length);
console.log('byteLength?=?%d',?Buffer.byteLength(name,?'utf8'));
緩沖區操作
Buffer還支持切片、拷貝、拼接、比較等操作。
buf.slice([start[,?end]])可以根據起止位置(不包含結束位置對應的數據)對一個緩沖區進行切片,返回一個新的Buffer對象,方便我們操作緩沖區的某個區域。但值得注意的是,這個切片是對原有緩沖區的引用,而不是副本,你對切片內容的修改,實際上修改的是原始的緩沖區。這個方法返回一個代表切片的Buffer對象。
buf.copy(targetBuffer[,?targetStart][,?sourceStart][,?sourceEnd])可以將一個緩沖區指定區域的內容拷貝到另一個緩沖的指定區域。類似C語言里的memcpy。targetStart指定目標緩沖區的起始偏移,sourceStart指定源緩沖區的起始偏移,它們默認都是0;sourceEnd指定源緩沖區的結束位置,默認是源緩沖區的長度。實際復制時,會比較目標緩沖區的長度和待復制區域的長度,哪個小按哪個來,不會越界。
Buffer有一個類方法,concat(list[,totalLength]),可以將一串緩沖區拼接成一個。第一個參數list是一個緩沖區數組,第二是待拼接的緩沖區的總長度。如果你不提供totalLength,concat會自己遍歷list中的緩沖區計算總長度,會有一點性能損失。這個方法返回拼接后的緩沖區。
看個示例代碼,演示切片、拷貝和拼接的用法:
var?buf1?=?new?Buffer('1234');
var?buf2?=?new?Buffer('12567');
var?bufList?=?[buf1,?buf2];
var?buf3?=?Buffer.concat(bufList);
console.log('buf3?-?%s',?buf3.toString());
var?buf4?=?buf3.slice(3,?8);
console.log('buf4?-?%s',?buf4.toString());
var?buf5?=?new?Buffer(5);
buf3.copy(buf5,?0,?1);
console.log('buf5?-?%s',?buf5.toString());
buf.equals(otherBuffer)判斷當前緩沖區是否和另一個相等,相等時返回true。
buf.compare(otherBuffer)比較當前緩沖區和另一個緩沖區的大小,相等返回0,小于返回-1,大于返回1。看下面的示例代碼:
var?buf1?=?new?Buffer('1234');
var?buf2?=?new?Buffer('12567');
var?buf3?=?new?Buffer('1234');
var?buf4?=?new?Buffer('0123');
console.log('buf1.compare(buf2)?=?',?buf1.compare(buf2));
console.log('buf1.compare(buf3)?=?',?buf1.compare(buf3));
console.log('buf1.compare(buf4)?=?',?buf1.compare(buf4));
以上就是Node.js中Buffer類的一些相關用法,大家在學習Node.js時,可嘗試開發一個小項目將上面這些方法都動手使用、實踐一遍,加深印象,以便今后開發中,遇到類似功能信手捏來。
總結
以上是生活随笔為你收集整理的node MySQL buffer_node.js中buffer方法使用说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql接口测试_用python实现接
- 下一篇: java 8 语法糖_Java8的lam