首頁 >web前端 >js教程 >Node.js中的緩衝與流模組詳細介紹_node.js

Node.js中的緩衝與流模組詳細介紹_node.js

WBOY
WBOY原創
2016-05-16 16:14:34924瀏覽

緩衝(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!');
  // 現在不允許繼續寫入了
});
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn