1. 流的概念
流(stream)在 Node.js 中是處理流資料的抽象介面(abstract interface)。 stream 模組提供了基礎的 API 。使用這些 API 可以很容易地來構建實現流介面的物件。
stream模組可以通過以下方式引入:
const stream = require('stream');
2.流的型別
Node.js中有四種基本的流型別
- Readable - 可讀的流(例如fs.createReadStream()).
- Writable - 可寫的流(例如fs.createWriteStream()).
- Duplex - 可讀寫的流 (例如net.Socket).
- Transform - 再讀寫過程中可以修改和變換資料的Duplex流(例如zlib.createDeflate()).
3.流中的資料有兩種模式,二進位制模式和物件模式
所有使用Node.js API 建立的物件都只能操作strings和Buffer(或 Uint8Array) 物件,但是通過第三方流的實現,你依然能夠處理其它型別的Javascript值,這些流被認為是工作在“物件模式”
4.緩衝
Writable和Readable流都會將資料儲存到內部的緩衝器(buffer)中。這些緩衝器可以通過相應的writable._writableState.getBuffer()或readable._readable.buffer來獲取 緩衝器的大小取決於傳遞給流建構函式的highWaterMark選項。對於普通的流,highWaterMark選項制定了總共的位元組數。對於工作在物件模式的流,highWaterMark指定流物件的總數
5.可讀流建立及監聽事件
所有的 Stream 物件都是 EventEmitter 的例項。常用的事件有:
- data:當資料可讀時觸發
- end: 沒有更多資料可讀時觸發
- error: 在接收和寫入過程中發生錯誤時觸發
- finish: 所有資料已被寫入到底層系統時觸發
下面寫一個例子,從流中讀取資料
var fs = require('fs');
var data = '';
//建立可讀流
var readerStream = fs.createReadStream('a.txt');
//設定編碼為utf8
readerStream.setEncoding('UTF8');
//處理流事件 data,end,error
readerStream.on('data',function(chunk){
data += chunk;
});
readerStream.on('end',function(){
console.log(data);
});
readerStream.on('error', function(){
console.log(err.stack);
})
console.log('程式執行完畢')
複製程式碼
執行結果
程式執行完畢
hello world!
複製程式碼
寫入流-例子
var fs = require('fs');
var data = '學習node stream';
//建立一個可寫流
var wirteStream = fs.createWriteStream('b.txt');
//使用utf8編碼寫入資料
wirteStream.write(data,'UTF8');
//標記檔案末尾
wirteStream.end();
//處理流事件 data,end, error,finish
wirteStream.on('finish',function(){
console.log('寫入完成');
})
wirteStream.on('error', function(err){
console.log(err.stack)
})
console.log('程式執行完畢');
複製程式碼
執行結果
程式執行完畢
寫入完成
複製程式碼
開啟b.txt檢視,內容為
學習node stream
複製程式碼
(未完待續)