二十五、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事件触发器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优盘怎么格式化怎么小了 优盘格式化后容量
- 下一篇: 生活常识:如何判断水果是否成熟?