nodeJS基礎 Stream用法

williamslau發表於2018-04-06

Stream是nodeJS的一個核心模組,在nodeJS中應用非常廣泛,比如HTTP 伺服器request和response物件都是流

  • 流的特點 1.有序的 2.有方向的
  • 流分分為兩種 1.可讀流 2.可寫流
  • 流不關心檔案的整體內容,只關注是否從檔案中讀到了資料,以及讀到資料之後的處理

可讀流的用法

let fs = require('fs');
let path = require('path');
let rs = fs.createReadStream(path.join(__dirname, '1.txt'), {
    flags: 'r', // 檔案的操作是讀取操作
    encoding: 'utf8', // 預設是null null代表的是buffer
    autoClose: true, // 讀取完畢後自動關閉
    highWaterMark: 3, // 預設是64k  64*1024b
    start: 0,
    end:3
});
複製程式碼

預設情況下不會將檔案中的內容輸出
內部會先建立一個Buffer先讀取3b(三位元組)
如果你不進行操作,預設是非流動模式,暫停狀態
當監聽data事件後,開始發射資料

rs.on('data', function (data) {
    console.log(data);
    //讀取

});
複製程式碼

暫停方法 暫停data事件觸發

rs.pause();
複製程式碼

恢復方法 恢復data事件觸發

rs.resume();
複製程式碼

除了data事件,可讀流還能監聽其他一些事件

end事件(暫停)
該事件會在讀完資料後被觸發

rs.on('end', function () {
    console.log('讀取完成');
});
複製程式碼

error事件
如果有錯誤會會觸發

rs.on('error', function (err) {
    console.log(err);
});
複製程式碼

open事件
開啟檔案

rs.on('open', function () {
    console.log('檔案開啟');
});
複製程式碼

close事件
關閉檔案

rs.on('close', function () {
    console.log('檔案關閉');
});
複製程式碼

設定編碼

rs.setEncoding('utf8');
複製程式碼

可寫流的用法

let fs = require('fs');
let ws = fs.createWriteStream('./4.txt', {
    flages: 'w',     //讀寫識別符號
    mode: 0o666, // 許可權
    autoClose: true, // 是否自動關閉
    highWaterMark: 3, // 預設是16k
    encoding: 'utf8', // 編碼格式
    start: 0 //從哪開始
});
複製程式碼

相對於可讀流,可寫流的方法就少多了

write方法
寫入後會返回一個布林值,來判斷系統快取區是否滿了

let flag = ws.write('寫入的內容','utf8',function(){});
console.log(flag);
複製程式碼

end方法
關閉方法,再關閉前可以最後傳入一次資料

ws.write('最後寫入的內容','utf8',function(){});
複製程式碼

drain方法
抽乾方法 當寫入完後,會觸發 必須快取區滿了被清空後才會出發drain事件

ws.on('drain', function () {
    console.log('抽乾')
})
複製程式碼

相關文章