咱们如今写一个类,而后能够传入一个文件路径获得类的实例 而后咱们能够监听它的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
人丑就要多读书函数