我们现在写一个类,然后可以传入一个文件路径得到类的实例 然后我们可以监听它的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 0Dlet 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');});复制代码
时间不早了,今天就到这了,洗洗睡了
人丑就要多读书