国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Node.js中的緩沖與流模塊詳細介紹

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

緩沖(buffer)模塊

js起初就是為瀏覽器而設計的,所以能很好的處理unicode編碼的字符串,但不能很好的處理二進制數據。這是Node.js的一個問題,因為Node.js旨在網絡上發送和接收經常是以二進制格式傳輸的數據。比如:

 - 通過TCP連接發送和接收數據;
 - 從圖像或者壓縮文件讀取二進制數據;
 - 從文件系統讀寫數據;
 - 處理來自網絡的二進制數據流

而Buffer模塊為Node.js帶來了一種存儲原始數據的方法,于是可以再js的上下文中使用二進制數據。每當需要在Node.js中處理I/O操作中移動的數據時,就有可能使用Buffer模塊。

類:Buffer

Buffer 類是一個全局變量類型,用來直接處理2進制數據的。 它能夠使用多種方式構建。

原始數據保存在 Buffer 類的實例中。一個 Buffer 實例類似于一個整數數組

1.new Buffer(size):分配一個新的 buffer 大小是 size 的8位字節.
2.new Buffer(array):分配一個新的 buffer 使用一個8位字節 array 數組.
3.new Buffer(str, [encoding]):encoding String類型 - 使用什么編碼方式,參數可選.

4.類方法: Buffer.isEncoding(encoding):如果給定的編碼 encoding 是有效的,返回 true,否則返回 false。
5.類方法: Buffer.isBuffer(obj):測試這個 obj 是否是一個 Buffer. 返回Boolean
6.類方法: Buffer.concat(list, [totalLength]):list {Array}數組類型,Buffer數組,用于被連接。totalLength {Number}類型 上述Buffer數組的所有Buffer的總大小。
除了可以讀取文件得到Buffer的實例外,還能夠直接構造,例如:

復制代碼 代碼如下:

var bin = new Buffer([ 0x48, 0x65, 0x6c, 0x6c, 0x6c ]);

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

復制代碼 代碼如下:

bin[0]; // => 0x48;

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

var str = bin.toString('utf-8'); // => "hello"

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

1.[ 0x48, 0x65, 0x6c, 0x6c, 0x6c ]
2.    ^           ^
3.    |           |
4.   bin     bin.slice(2)

寫入緩沖區

復制代碼 代碼如下:

var buffer = new Buffer(8);//創建一個分配了8個字節內存的緩沖區
console.log(buffer.write('a','utf8'));//輸出1

這會將字符"a"寫入緩沖區,node返回經過編碼以后寫入緩沖區的字節數量,這里的字母a的utf-8編碼占用1個字節。

復制緩沖區

Node.js提供了一個將Buffer對象整體內容復制到另一個Buffer對象中的方法。我們只能在已經存在的Buffer對象之間復制,所以必須創建它們。

復制代碼 代碼如下:

buffer.copy(bufferToCopyTo)

其中,bufferToCopyTo是要復制的目標Buffer對象。如下示例:

復制代碼 代碼如下:

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類型的操作系統中,流是個標準的概念。有如下三個主要的流:

1.標準輸入
2.標準輸出
3.標準錯誤

可讀流

如果說,緩沖區是Node.js處理原始數據的方式的話,那么流通常是Node.js移動數據的方式。Node.js中的流是可讀的或者可寫的。Node.js中許多模塊都使用了流,包括HTTP和文件系統。

假設我們創建一個classmates.txt的文件,并從中讀入姓名清單,以便使用這些數據。由于數據是流,這就意味著完成文件讀取之前,從收到最初幾個字節開始,就可以對數據動作,這是Node.js中的一個常見模式:

復制代碼 代碼如下:

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')
});

在以上示例中,在收到新數據時觸發事件數據。當文件讀取完成后觸發關閉事件。

可寫流

顯然,我們也可以創建可寫流以便寫數據。這意味著,只要一段簡單的腳本,就可以使用流讀入文件然后寫入另一個文件:

復制代碼 代碼如下:

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();
});

現在,當接收到數據事件時,數據會被寫入可寫流中。

readable.setEncoding(encoding):返回: this

readable.resume():同上。該方法讓可讀流繼續觸發 data 事件。

readable.pause():同上。該方法會使一個處于流動模式的流停止觸發 data 事件,切換到非流動模式,并讓后續可用數據留在內部緩沖區中。
類: stream.Writable

Writable(可寫)流接口是對您正在寫入數據至一個目標的抽象。

1.writable.write(chunk, [encoding], [callback]):

chunk {String | Buffer} 要寫入的數據
encoding {String} 編碼,假如 chunk 是一個字符串
callback {Function} 數據塊寫入后的回調
返回: {Boolean} 如果數據已被全部處理則 true。

該方法向底層系統寫入數據,并在數據被處理完畢后調用所給的回調。

2.writable.cork():強行滯留所有寫入。

滯留的數據會在 .uncork() 或 .end() 調用時被寫入。

3.writable.end([chunk], [encoding], [callback])

chunk {String | Buffer} 可選,要寫入的數據
encoding {String} 編碼,假如 chunk 是一個字符串
callback {Function} 可選,流結束后的回調
在調用 end() 后調用 write() 會產生錯誤。

復制代碼 代碼如下:

// 寫入 'hello, ' 然后以 'world!' 結束
http.createServer(function (req, res) {
  res.write('hello, ');
  res.end('world!');
  // 現在不允許繼續寫入了
});

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 富川| 镇江市| 太白县| 东至县| 沧州市| 文水县| 汉中市| 富川| 集贤县| 苍梧县| 大渡口区| 武汉市| 驻马店市| 启东市| 永顺县| 常州市| 正阳县| 五台县| 清河县| 渭源县| 临泉县| 兴和县| 顺义区| 铜鼓县| 察哈| SHOW| 桂东县| 南江县| 隆林| 重庆市| 西平县| 隆昌县| 吴川市| 罗田县| 呼玛县| 大埔区| 高阳县| 滦平县| 大名县| 金平| 沧州市|