@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事件触发器相关推荐

  1. 二十五.SLAM中Mapping和Localization区别和思考

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

  2. osgEarth的Rex引擎原理分析(二十五)地形瓦片大小尺寸和LOD的关系

    目标:(十八)中的问题55 osgEarth::TerrainOption中_tileSize默认大小为17,LOD的默认范围为0-23,这两个值的关系是什么? 还有瓦片的像素尺寸_tilePixel ...

  3. moran指数 r语言_白话空间统计之二十五:空间权重矩阵(四)R语言中的空间权重矩阵(2):不同空间关系对莫兰指数的影响...

    原标题:白话空间统计之二十五:空间权重矩阵(四)R语言中的空间权重矩阵(2):不同空间关系对莫兰指数的影响 上一篇,讲了R语言中的空间权重矩阵的结构,这一节讲讲R语言里面空间权重矩阵的自定义. 与Ar ...

  4. Python之精心整理的二十五个文本提取及NLP相关的处理案例

    一.提取 PDF 内容 # pip install PyPDF2 安装 PyPDF2 import PyPDF2 from PyPDF2 import PdfFileReader# Creating ...

  5. OpenGL 图形库的使用(二十五)—— 高级OpenGL之帧缓冲Framebuffers

    https://www.jianshu.com/p/d7066d6a02cc OpenGL 图形库的使用(二十五)-- 高级OpenGL之帧缓冲Framebuffers  刀客传奇 关注 0.2 20 ...

  6. JavaScript 编程精解 中文第三版 二十、Node.js

    二十.Node.js 原文:Node.js 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了<JavaScript 编程精解(第 2 版)> A stude ...

  7. CSDN 编程竞赛二十五期题解

    竞赛总览 CSDN 编程竞赛二十五期:比赛详情 (csdn.net) 本期竞赛第一题完成之后,提交代码显示运行中.自测也一直显示运行中,不能得到测试结果. 于是又赶紧完成第二题,但也显示运行中. 第三 ...

  8. 2021年大数据Hadoop(二十五):YARN通俗介绍和基本架构

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 YARN通俗介绍和基本架构 Yarn通俗介绍 Yarn基本 ...

  9. VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池

    VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池 终端服务池是指由一台或多台微软终端服务器提供服务的桌面源组成的池.终端服务器桌面源可交付多个桌面.它具有以下特征: 1.终端 ...

最新文章

  1. Jasperreport导出pdf内容展示不完全处理
  2. php敏感字符串过滤_PHP代码审计入门:常见的危险函数和审计点
  3. 浏览器兼容性问题解决方案· 总结
  4. 当安全遇到大数据 “永恒之蓝”也将无所遁形!
  5. Android----Google code android开源项目(四)
  6. 数据挖掘相关知识介绍
  7. tf.train.Saver
  8. web通讯录之登录注册界面
  9. Linux unzip命令:解压zip文件
  10. leetcode —— 200. 岛屿数量
  11. CVPR2019| 最新CVPR2019论文抢先看!
  12. spring配置文件最全约束
  13. django--rtbac权限管理
  14. 批量自动化配置Dell服务器idrac管理口IP
  15. IO流---基础 (附相对路径)
  16. linux 下dump的使用
  17. 【Python】python的加、减、乘、除、取整、取余计算
  18. ProGuard技术详解
  19. 商业智能(Business Intelligence)介绍
  20. JAVA 随机数生成方式

热门文章

  1. mysql timestamp 插入null报错_读MySQL 5.7文档11.2 Date and Time Data Types总结
  2. java系统界面找不到符号,找不到符号,java找不到符号
  3. hdu 4417 Super Mario 树状数组||主席树
  4. jquery中prop()方法和attr()方法的区别浅析
  5. Linux入门(6)——Ubuntu16.04安装atom
  6. HDU 1176 免费馅饼 矩阵取数, dp + 滚动数组
  7. Beyond Compare 3 设置自动换行
  8. 组成原理----存储管理
  9. JSON 分析数据格式
  10. python tips(持续更新)