node中的流的介紹(Stream)

周必川發表於2018-04-07

Stream是一個抽象介面,Node中有很多物件實現了這個介面。例如,對http伺服器發起請求的request物件就是一個Stream,還有stdout(標準輸出)。

Node.js,Stream有四種流型別:

  • Readable--可讀操作。
  • Writable--可寫操作。
  • Duplex--可讀可寫操作。
  • Transform--操作被寫入資料,然後讀出結果。


所有的Stream物件都是EventEmitter的實列。常用的事件有:

  • data--當有資料可讀時觸發。
  • end--沒有更多的資料可讀時觸發。
  • error--在接收和寫入過程中發生錯誤時觸發。
  • finish--所有資料已被寫入到底層系統時觸發。


1、Readable


以fs為例建立一個可讀流:

fs.createReadStream(path,[options]);

  • path --- 要讀取檔案的路徑
  • options --- 一個陣列物件包含:

                  flags:指定用什麼模式開啟,“w”代表寫,“r”代表讀。

                  endoding:編碼格式“utf8","ascii","base64"三種格式,預設“utf8”。

                  highWaterMark:水位線

                  autoClose:為true時(預設行為),對錯誤或結束的檔案描述符將自動關閉,為                 false時,檔案描述符將不會被關閉,即使他們報錯了。

                 start:開始讀取的位元組位置

                 end:結束讀取的位元組位置。

建立一個1.txt檔案,內容:asdfasd

同一目錄下建立一個js檔案

let fs = require("fs");
let path = require("path");
let readable = fs.createReadStream(path.join(__dirname,"./1.txt"),{
    flags: 'r',
    encoding: 'utf8',
    autoClose: true,
    mode: "0666",
});
readable.on('data', function(chunk){
    console.log( chunk.length, chunk);
});
//7 'asdfasd'複製程式碼

可讀的流有兩種模式:

流動模式:資料會自動從來源流出,直到來源資料耗盡。

暫停模式:你得通過stream.read()主動去要資料,不要資料就一直等在那。


可讀流在建立時都是暫停模式。暫停模式和流動模式可以相互轉換。


2、Writable

例如:

let fs = require("fs");
let path = require("path");
let writable = fs.createWriteStream(path.join(__dirname,"./1.txt"),{
    flags: 'w',
    encoding: 'utf8',
    autoClose: true,
    mode: "0666",
});
writable.on('finish', function(){
    console.log('寫入完成');
    process.exit(0);
});
writable.write('node修煉中...', 'utf8');
writable.end();
//寫入完成複製程式碼

3、Duplex


4、Transform

變換流的例項包括:


相關文章