nodejs流之行讀取器例子

咱們如今寫一個類,而後能夠傳入一個文件路徑獲得類的實例 而後咱們能夠監聽它的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

人醜就要多讀書函數

相關文章
相關標籤/搜索