博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nodejs流之行读取器例子
阅读量:6153 次
发布时间:2019-06-21

本文共 2829 字,大约阅读时间需要 9 分钟。

我们现在写一个类,然后可以传入一个文件路径得到类的实例 然后我们可以监听它的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');});复制代码

时间不早了,今天就到这了,洗洗睡了

人丑就要多读书

转载地址:http://qvbfa.baihongyu.com/

你可能感兴趣的文章
Microsoft Licenses Flash Lite for Windows Mobile Users
查看>>
HDOJ 2020 绝对值排序
查看>>
HDOJ/HDU 2560 Buildings(嗯~水题)
查看>>
Maven编译时跳过Test
查看>>
Spring Boot 整合Spring Security 和Swagger2 遇到的问题小结
查看>>
[20170628]12C ORA-54032.txt
查看>>
linux运维人员的成功面试总结案例分享
查看>>
Windows DHCP Server基于MAC地址过滤客户端请求实现IP地址的分配
查看>>
命令查询每个文件文件数
查看>>
《跟阿铭学Linux》第8章 文档的压缩与打包:课后习题与答案
查看>>
RAC表决磁盘管理和维护
查看>>
Apache通过mod_php5支持PHP
查看>>
发布一个TCP 吞吐性能测试小工具
查看>>
java学习:jdbc连接示例
查看>>
PHP执行批量mysql语句
查看>>
Extjs4.1.x 框架搭建 采用Application动态按需加载MVC各模块
查看>>
Silverlight 如何手动打包xap
查看>>
建筑电气暖通给排水协作流程
查看>>
JavaScript面向对象编程深入分析(2)
查看>>
linux 编码转换
查看>>