緩衝(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的實例外,還能夠直接構造,例如:
Buffer與字串類似,除了可以用.length屬性得到位元組長度外,還可以用[index]方式讀取指定位置的位元組,例如:
寫入緩衝區
複製緩衝區
Node.js提供了一個將Buffer物件整體內容複製到另一個Buffer物件中的方法。我們只能在已經存在的Buffer物件之間複製,所以必須建立它們。
其中,bufferToCopyTo是要複製的目標Buffer物件。如下範例:
流模組
在UNIX類型的作業系統中,流是個標準的概念。有以下三個主要的流:
1.標準輸入
2.標準輸出
3.標準錯誤
可讀流
如果說,緩衝區是Node.js處理原始資料的方式的話,那麼流通常是Node.js移動資料的方式。 Node.js中的流是可讀的或可寫的。 Node.js中許多模組都使用了流,包括HTTP和檔案系統。
假設我們建立一個classmates.txt的文件,並從中讀入姓名清單,以便使用這些資料。由於資料是流,這意味著完成檔案讀取之前,從收到最初幾個位元組開始,就可以對資料動作,這是Node.js中的一個常見模式:
在上述範例中,在收到新資料時觸發事件資料。當文件讀取完成後觸發關閉事件。
可寫流
顯然,我們也可以建立可寫流以便寫資料。這意味著,只要一段簡單的腳本,就可以使用流讀入檔案然後寫入另一個檔案:
現在,當接收到資料事件時,資料會被寫入可寫流中。
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() 會產生錯誤。