Node.js中的緩沖與流模塊詳細(xì)介紹
緩沖(buffer)模塊
js起初就是為瀏覽器而設(shè)計(jì)的,所以能很好的處理unicode編碼的字符串,但不能很好的處理二進(jìn)制數(shù)據(jù)。這是Node.js的一個(gè)問題,因?yàn)镹ode.js旨在網(wǎng)絡(luò)上發(fā)送和接收經(jīng)常是以二進(jìn)制格式傳輸?shù)臄?shù)據(jù)。比如:
- 通過TCP連接發(fā)送和接收數(shù)據(jù);
- 從圖像或者壓縮文件讀取二進(jìn)制數(shù)據(jù);
- 從文件系統(tǒng)讀寫數(shù)據(jù);
- 處理來自網(wǎng)絡(luò)的二進(jìn)制數(shù)據(jù)流
而Buffer模塊為Node.js帶來了一種存儲(chǔ)原始數(shù)據(jù)的方法,于是可以再js的上下文中使用二進(jìn)制數(shù)據(jù)。每當(dāng)需要在Node.js中處理I/O操作中移動(dòng)的數(shù)據(jù)時(shí),就有可能使用Buffer模塊。
類:Buffer
Buffer 類是一個(gè)全局變量類型,用來直接處理2進(jìn)制數(shù)據(jù)的。 它能夠使用多種方式構(gòu)建。
原始數(shù)據(jù)保存在 Buffer 類的實(shí)例中。一個(gè) Buffer 實(shí)例類似于一個(gè)整數(shù)數(shù)組
1.new Buffer(size):分配一個(gè)新的 buffer 大小是 size 的8位字節(jié).
2.new Buffer(array):分配一個(gè)新的 buffer 使用一個(gè)8位字節(jié) array 數(shù)組.
3.new Buffer(str, [encoding]):encoding String類型 - 使用什么編碼方式,參數(shù)可選.
4.類方法: Buffer.isEncoding(encoding):如果給定的編碼 encoding 是有效的,返回 true,否則返回 false。
5.類方法: Buffer.isBuffer(obj):測(cè)試這個(gè) obj 是否是一個(gè) Buffer. 返回Boolean
6.類方法: Buffer.concat(list, [totalLength]):list {Array}數(shù)組類型,Buffer數(shù)組,用于被連接。totalLength {Number}類型 上述Buffer數(shù)組的所有Buffer的總大小。
除了可以讀取文件得到Buffer的實(shí)例外,還能夠直接構(gòu)造,例如:
var bin = new Buffer([ 0x48, 0x65, 0x6c, 0x6c, 0x6c ]);
Buffer與字符串類似,除了可以用.length屬性得到字節(jié)長(zhǎng)度外,還可以用[index]方式讀取指定位置的字節(jié),例如:
bin[0]; // => 0x48;
Buffer與字符串能夠互相轉(zhuǎn)化,例如可以使用指定編碼將二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為字符串:
var str = bin.toString('utf-8'); // => "hello"
.slice方法不是返回一個(gè)新的Buffer,而更像是返回了指向原Buffer中間的某個(gè)位置的指針,如下所示。
1.[ 0x48, 0x65, 0x6c, 0x6c, 0x6c ]
2. ^ ^
3. | |
4. bin bin.slice(2)
寫入緩沖區(qū)
var buffer = new Buffer(8);//創(chuàng)建一個(gè)分配了8個(gè)字節(jié)內(nèi)存的緩沖區(qū)
console.log(buffer.write('a','utf8'));//輸出1
這會(huì)將字符"a"寫入緩沖區(qū),node返回經(jīng)過編碼以后寫入緩沖區(qū)的字節(jié)數(shù)量,這里的字母a的utf-8編碼占用1個(gè)字節(jié)。
復(fù)制緩沖區(qū)
Node.js提供了一個(gè)將Buffer對(duì)象整體內(nèi)容復(fù)制到另一個(gè)Buffer對(duì)象中的方法。我們只能在已經(jīng)存在的Buffer對(duì)象之間復(fù)制,所以必須創(chuàng)建它們。
buffer.copy(bufferToCopyTo)
其中,bufferToCopyTo是要復(fù)制的目標(biāo)Buffer對(duì)象。如下示例:
var buffer1 = new Buffer(8);
buffer1.write('nice to meet u','utf8');
var buffer2 = new Buffer(8);
buffer1.copy(buffer2);
console.log(buffer2.toString());//nice to meet u
流模塊
在UNIX類型的操作系統(tǒng)中,流是個(gè)標(biāo)準(zhǔn)的概念。有如下三個(gè)主要的流:
1.標(biāo)準(zhǔn)輸入
2.標(biāo)準(zhǔn)輸出
3.標(biāo)準(zhǔn)錯(cuò)誤
可讀流
如果說,緩沖區(qū)是Node.js處理原始數(shù)據(jù)的方式的話,那么流通常是Node.js移動(dòng)數(shù)據(jù)的方式。Node.js中的流是可讀的或者可寫的。Node.js中許多模塊都使用了流,包括HTTP和文件系統(tǒng)。
假設(shè)我們創(chuàng)建一個(gè)classmates.txt的文件,并從中讀入姓名清單,以便使用這些數(shù)據(jù)。由于數(shù)據(jù)是流,這就意味著完成文件讀取之前,從收到最初幾個(gè)字節(jié)開始,就可以對(duì)數(shù)據(jù)動(dòng)作,這是Node.js中的一個(gè)常見模式:
var fs = require('fs');
var stream = fs.ReadStream('classmates.txt');
stream.setEncoding('utf8');
stream.on('data', function (chunk) {
console.log('read some data')
});
stream.on('close', function () {
console.log('all the data is read')
});
在以上示例中,在收到新數(shù)據(jù)時(shí)觸發(fā)事件數(shù)據(jù)。當(dāng)文件讀取完成后觸發(fā)關(guān)閉事件。
可寫流
顯然,我們也可以創(chuàng)建可寫流以便寫數(shù)據(jù)。這意味著,只要一段簡(jiǎn)單的腳本,就可以使用流讀入文件然后寫入另一個(gè)文件:
var fs = require('fs');
var readableStream = fs.ReadStream('classmates.txt');
var writableStream = fs.writeStream('names.txt');
readableStream.setEncoding('utf8');
readableStream.on('data', function (chunk) {
writableStream.write(chunk);
});
readableStream.on('close', function () {
writableStream.end();
});
現(xiàn)在,當(dāng)接收到數(shù)據(jù)事件時(shí),數(shù)據(jù)會(huì)被寫入可寫流中。
readable.setEncoding(encoding):返回: this
readable.resume():同上。該方法讓可讀流繼續(xù)觸發(fā) data 事件。
readable.pause():同上。該方法會(huì)使一個(gè)處于流動(dòng)模式的流停止觸發(fā) data 事件,切換到非流動(dòng)模式,并讓后續(xù)可用數(shù)據(jù)留在內(nèi)部緩沖區(qū)中。
類: stream.Writable
Writable(可寫)流接口是對(duì)您正在寫入數(shù)據(jù)至一個(gè)目標(biāo)的抽象。
1.writable.write(chunk, [encoding], [callback]):
chunk {String | Buffer} 要寫入的數(shù)據(jù)
encoding {String} 編碼,假如 chunk 是一個(gè)字符串
callback {Function} 數(shù)據(jù)塊寫入后的回調(diào)
返回: {Boolean} 如果數(shù)據(jù)已被全部處理則 true。
該方法向底層系統(tǒng)寫入數(shù)據(jù),并在數(shù)據(jù)被處理完畢后調(diào)用所給的回調(diào)。
2.writable.cork():強(qiáng)行滯留所有寫入。
滯留的數(shù)據(jù)會(huì)在 .uncork() 或 .end() 調(diào)用時(shí)被寫入。
3.writable.end([chunk], [encoding], [callback])
chunk {String | Buffer} 可選,要寫入的數(shù)據(jù)
encoding {String} 編碼,假如 chunk 是一個(gè)字符串
callback {Function} 可選,流結(jié)束后的回調(diào)
在調(diào)用 end() 后調(diào)用 write() 會(huì)產(chǎn)生錯(cuò)誤。
// 寫入 'hello, ' 然后以 'world!' 結(jié)束
http.createServer(function (req, res) {
res.write('hello, ');
res.end('world!');
// 現(xiàn)在不允許繼續(xù)寫入了
});
- node.js中的buffer.copy方法使用說明
- node.js中的buffer.fill方法使用說明
- node.js中的buffer.length方法使用說明
- node.js中的buffer.toJSON方法使用說明
- node.js中的buffer.toString方法使用說明
- node.js中的buffer.Buffer.isEncoding方法使用說明
- node.js中的buffer.Buffer.isBuffer方法使用說明
- node.js中的buffer.Buffer.byteLength方法使用說明
- node.js中的buffer.slice方法使用說明
- node.js中的buffer.write方法使用說明
- Node.js中使用Buffer編碼、解碼二進(jìn)制數(shù)據(jù)詳解
- nodejs基礎(chǔ)之buffer緩沖區(qū)用法分析
相關(guān)文章
Node.js引入U(xiǎn)IBootstrap的方法示例
這篇文章主要介紹了Node.js引入U(xiǎn)IBootstrap的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05詳解Node.js中path模塊的resolve()和join()方法的區(qū)別
這篇文章主要介紹了詳解Node.js中path模塊的resolve()和join()方法的區(qū)別,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10node.js文件系統(tǒng)之文件寫入實(shí)例詳解
Node.js和其他語言一樣,也有文件操作,下面這篇文章主要給大家介紹了關(guān)于node.js文件系統(tǒng)之文件寫入的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03node.js 基于cheerio的爬蟲工具的實(shí)現(xiàn)(需要登錄權(quán)限的爬蟲工具)
這篇文章主要介紹了node.js 基于cheerio的爬蟲工具的實(shí)現(xiàn)(需要登錄權(quán)限的爬蟲工具) ,需要的朋友可以參考下2019-04-04jwt在node中的應(yīng)用實(shí)踐(安裝配置封裝)
這篇文章主要為大家介紹了jwt在node中的應(yīng)用實(shí)踐包括安裝配置封裝,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09詳解nodejs微信公眾號(hào)開發(fā)——6.自定義菜單
這篇文章主要介紹了詳解nodejs微信公眾號(hào)開發(fā)——6.自定義菜單,自定義菜單能夠幫助公眾號(hào)豐富界面,讓用戶更好更快地理解公眾號(hào)的功能。2017-04-04