咱們如今寫一個類,而後能夠傳入一個文件路徑獲得類的實例 而後咱們能夠監聽它的newLine事件,當這個行讀取器每次讀到一行的時候就會向外發射newLine事件,當讀到結束的時候會發射end事件 mac下的:<Buffer 31 32 33 0a 34 35 36 0a 37 38 39 0a 30>數組
Unix系統裏,每行結尾只有換行"(line feed)",即"\n",
Windows系統裏面,每行結尾是"<回車><換行>",即"\r\n"
Mac系統裏,每行結尾是"回車"(carriage return),即"\r"
在ASCII碼裏
換行 \n 10 0A
回車 \r 13 0D
緩存
let EventEmitter = require("events");
let util = require("util");
let fs = require("fs");
const NEW_LINE = 0x0A; // /n換行
const RETURN = 0x0D; // /r 回車
function LineReader(path, encoding) {
EventEmitter.call(this); //成爲EventEmitter的子類,後面會用到EventEmitter父類的方法
this.encoding = encoding || "utf8";
this._reader = fs.createReadStream(path); //建立一個可讀流
//當給一個隨心添加一個新的監聽函數時候回觸發newListener事件
this.on("newListener", (type, listener) => {
//若是說你添加了newLine和監聽,那麼就開始讀取文件內容並按行發射數據
if (type == "newLine") { //監聽事件
//當咱們監聽了一個可讀流的readable事件,流會調用底層的讀取文件的API方法填充緩存區,填充完以後向外發射readable事件
let buffers = [];
//兩種方式來監聽可讀流,on("data")流動模式不走緩存區 on("readable") 暫停模式
this._reader.on("readable", () => {
let char; //Buffer 是一個只有一個字節Buffer
//console.log(this._reader.read(1)); //[Buffer 31]
while (null != (char = this._reader.read(1))) {
switch (char[0]) {
case NEW_LINE:
//buffers是以個字節數組,因此咱們要用Buffer.from來轉換成Buffer
this.emit("newLine", Buffer.from(buffers).toString(this.encoding));
buffers.length = 0; //清空緩存
break;
case RETURN:
this.emit("newLine", Buffer.from(buffers).toString(this.encoding));
buffers.length = 0; //清空緩存
//日後再讀一個字節
let nChar=this._reader.read(1);
if(nChar[0]!=NEW_LINE){
buffers.push(nChar[0]);
}
break;
default:
//每次讀一個字節放到buffers裏面緩存起來
buffers.push(char[0]);
break;
}
}
});
//當你用流去監聽數據的時候用on("data")或者on("readable")都同樣,當讀完以後讀會發射end事件
this._reader.on("end",()=>{
//當end的時候有可能還有數據因此要emit發射一下
this.emit('newLine',Buffer.from(buffers).toString(this.encoding));
this.emit("end");
})
}
})
};
util.inherits(LineReader, EventEmitter);
module.exports = LineReader;
複製代碼
let LineReader = require('./5.LineReader');
let reader = new LineReader('./1.txt','utf8');
reader.on('newLine',data=>{
console.log(data);//123 456 789 0
});
reader.on('end',()=>{
console.log('over');
});
複製代碼
時間不早了,今天就到這了,洗洗睡了bash
人醜就要多讀書函數