二十五、Node中的Buffer缓冲器和EventEmitter事件触发器
@Author:Runsen
@Date:2020/6/5
作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件。导致翘课严重,专业排名中下。.在大学60%的时间,都在CSDN。
我要反复查漏补缺,将2018年的东西捡回来,形成高效学习。
今天,我要写的是Node中的Buffer缓冲器和EventEmitter事件触发器,写之前,先去菜鸟教程看看,偷窥学习一下JavaScript表单中的验证API。
文章目录
- Buffer缓冲器
- 创建buffer类
- 读取缓冲区数据
- 转换为json格式输出
- 合并缓冲区
- Buffer的操作
- 缓冲区长度
- EventEmitter
Buffer缓冲器
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
Buffer 类在全局作用域中,因此无需使用 require(‘buffer’).Buffer。
const buf = Buffer.from('Runsen', 'ascii');// 输出 52756e73656econsole.log(buf.toString('hex'));// 输出 UnVuc2Vu console.log(buf.toString('base64'));buffer类用来创建专门存放二进制数据的缓冲区域,因此输出只有二进制
创建buffer类
**1、创建buffer类,写入内容 var buf = new Buffer('www.baidu.com','utf-8'); //<Buffer 77 77 77 2e 62 61 69 64 75 2e 63 6f 6d> console.log(buf); var buf = new Buffer(26); var len = buf.write('www.baidu.com'); console.log('写入字节数:'+len); //写入字节数:13读取缓冲区数据
buffer.toString(encoding, star, end); encoding编码格式 默认使用utf8编码格式 star:开始位置 end:结束位置
var buf = new Buffer(26); for(var i = 0; i < 26; i++){buf[i] = i; } console.log(buf); //<Buffer 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19> 十六进制数 var buf = new Buffer(26); for(let i = 0; i < 26; i++){buf[i] = i + 97; //转换成小写字母 } console.log(buf.toString('ascii')); //abcdefghijklmnopqrstuvwxyz console.log(buf.toString('ascii', 0, 10)); //abcdefghij 截取下标,截至下标 console.log(buf.toString('utf8', 0, 10)); //abcdefghij console.log(buf.toString(undefined, 0, 5)); //abcde 使用utf8编码格式输出转换为json格式输出
var buf = new Buffer(26); for(let i = 0; i < 26; i++){buf[i] = i + 97; //转换成小写字母 } console.log(buf.toJSON(buf));合并缓冲区
用的是Buffer.concat(list[, totalLength]);
var buf1 = new Buffer('www.baidu.com'); var buf2 = new Buffer('百度一下,你就知道'); var buf3 = Buffer.concat([buf1,buf2]); console.log(buf3.toString()); //www.baidu.com百度一下,你就知道Buffer的操作
Buffer还支持切片、拷贝、拼接、比较等操作。
看个示例代码,演示切片、拷贝和拼接的用法:
var buf1 = new Buffer('1234'); var buf2 = new Buffer('12567'); var bufList = [buf1, buf2]; var buf3 = Buffer.concat(bufList); var buf4 = buf3.slice(3, 8); var buf5 = new Buffer(5); buf3.copy(buf5, 0, 1);缓冲区长度
var buf = new Buffer('Runsen'); var newbuf = buf.slice(3,5); console.log(newbuf.toString()); //se console.log('length:'+newbuf.length); //length:5下面是Buffer缓冲器的总结
EventEmitter
Nodejs 使用了一个事件驱动、非阻塞 IO 的模型。events模块是事件驱动的核心模块。很多内置模块都继承了events.EventEmitter。
var events = require('events');nodejs的events 模块只提供了一个对象: events.EventEmitter。EventEmitter的核心就是事件发射与事件监听器功能的封装。EventEmitter的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter支持若干个事件监听器。当事件发射时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。
这是菜鸟教程的案例
//event.js 文件 var EventEmitter = require('events').EventEmitter; var event = new EventEmitter(); event.on('some_event', function() { console.log('some_event 事件触发'); }); setTimeout(function() { event.emit('some_event'); }, 1000);执行结果如下:
运行这段代码,1 秒后控制台输出了 ‘some_event 事件触发’。其原理是 event 对象注册了事件 some_event 的一个监听器,然后我们通过 setTimeout 在 1000 毫秒以后向 event 对象发送事件 some_event,此时会调用some_event 的监听器。
下面最我编写的代码,以加强对事件驱动的理解:
const events = require('events'); const sum = new events.EventEmitter(); let execsum = 0; let A = 0; let B = 0; function sumA() {console.log('A = ', A);A = A + 1; }// 简写成函数,ES6语法sum.on('eventB', () => {console.log('\n');console.log('B = ', B);B = B + 1; });sum.on('eventA', sumA);// 计数器setInterval(() => {sum.emit('eventA'); }, 1000);setInterval(() => {sum.emit('eventB'); }, 2000); console.log('end');执行效果如下面的GIF所示。
A一秒加一次
B两秒加一次
总结
以上是生活随笔为你收集整理的二十五、Node中的Buffer缓冲器和EventEmitter事件触发器的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 优盘怎么格式化怎么小了 优盘格式化后容量
- 下一篇: 五十三、开始算法刷题磨练