<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 一、Buffer &emsp;&emsp;Buffer是一種Node的內置類型,不需要通過require()函數額外引入。它能讀取和寫入二進制數據,常用于解析網絡數據流、文件等。 **1)創建** &emsp;&emsp;通過new關鍵字初始化Buffer對象的方式已經被廢棄,下面的代碼都已經過時。 ~~~javascript new Buffer(array) new Buffer(arrayBuffer[, byteOffset[, length]]) new Buffer(buffer) new Buffer(size) new Buffer(string[, encoding]) ~~~ &emsp;&emsp;目前有兩種方式創建Buffer對象,第一種是通過alloc()或allocUnsafe()兩個靜態方法,語法如下。 ~~~javascript Buffer.alloc(size[, fill[, encoding]]) Buffer.allocUnsafe(size) ~~~ &emsp;&emsp;alloc()方法可接收三個參數,后兩個是可選的。第一個參數是長度,第二個參數是預填充的值,第三個參數是字符編碼,默認值是“utf8”。 ~~~ const buf1 = Buffer.alloc(10); const buf2 = Buffer.alloc(10, "A"); const buf3 = Buffer.alloc(10, "A", "ascii"); ~~~ &emsp;&emsp;如果打印buf3,那么得到的將是一組十六進制數據,而非難以閱讀的二進制數據,如下所示。 ~~~ <Buffer 41 41 41 41 41 41 41 41 41 41> ~~~ &emsp;&emsp;注意,Buffer的大小在創建時確定,后面也無法更改,其類型可由Buffer.isBuffer()辨別。當前Node支持的字符編碼有6種: &emsp;&emsp;(1)ascii:僅適用于7位的ASCII數據。 &emsp;&emsp;(2)utf8:多字節編碼的Unicode字符。許多網頁和其它文檔格式都在使用UTF-8。 &emsp;&emsp;(3)utf16le/ucs2:2或4個字節,小端序編碼的Unicode字符。支持代理對(U+10000至U+10FFFF)。 &emsp;&emsp;(4)base64:Base64編碼,一種基于64個可打印字符來表示二進制數據的表示方法。 &emsp;&emsp;(5)latin1/binary:一種可編碼成單字節字符串的方法。 &emsp;&emsp;(6)hex:將每個字節編碼成兩個十六進制的字符。 &emsp;&emsp;allocUnsafe()是一個不安全的方法,因為它分配的內存片段是未初始化的,即沒有被清零。雖然這種設計性能優越,但分配的內存中可能會包含舊數據。 &emsp;&emsp;第二種是通過Buffer.from()方法創建Buffer對象,它的參數可以是數組、字符串、Buffer對象等,如下所示。 ~~~ const buf = Buffer.from("A"); console.log(buf); //<Buffer 41> ~~~ **2)轉換編碼** &emsp;&emsp;在讀取文件時,可通過toString()方法將Buffer對象轉換成字符串,如下所示,默認是UTF-8格式。 ~~~ const fs = require('fs'); fs.readFile('./demo.txt', (err, buf) => { buf.toString();   //"你好,Node.js" buf.toString("base64"); //"5L2g5aW977yMTm9kZS5qcw==" }); ~~~ ## 二、流 &emsp;&emsp;Node中的stream模塊用于處理流式數據,許多內置的核心模塊都在其內部實現了流操作,流還適用于網絡傳輸、JSON解析器、RFC(遠程調用)等。流包括四個抽象類: &emsp;&emsp;(1)Readable:可讀流,讀取底層的I/O數據源。 &emsp;&emsp;(2)Writeable:可寫流,將數據寫入到目標中。 &emsp;&emsp;(3)Duplex:雙工流,即可讀也可寫。 &emsp;&emsp;(4)Transform:轉換流,會修改數據的雙工流。 **1)pipe()** &emsp;&emsp;在可讀流中,包含一個管道方法:pipe(),它的作用是關聯可讀流與可寫流,讓數據通過管道從可讀流進入到可寫流中。pipe()方法能接收一個Writable對象,并返回對目標流的引用,從而可形成鏈式調用。 &emsp;&emsp;在下面的示例中,會將origin.txt中的數據通過管道寫入到target.txt文件中,調用文件模塊的createReadStream()方法能得到一個Readable對象。 ~~~ const fs = require('fs'); const readable = fs.createReadStream('./origin.txt'); const writable = fs.createWriteStream('./target.txt'); readable.pipe(writable); ~~~ **2)事件** &emsp;&emsp;以可讀流為例,它的data事件可在接收到數據塊后觸發,而end事件會在流沒有數據時觸發。在下面的示例中,origin.txt文件包含的內容是“hello Node.js”。 ~~~ const fs = require('fs'); const readable = fs.createReadStream('./origin.txt', {highWaterMark: 2}); readable.on("data", (chunk) => { console.log(`接收到 ${chunk.length} 個字節的數據`, chunk.toString()); }); readable.on("end", () => { console.log("結束接收"); }); ~~~ &emsp;&emsp;在調用createReadStream()方法時,包含一個highWaterMark屬性,其默認值為64KB,它的作用是限制可緩沖的字節數。當定義為2后,每接收2個字節的數據,就會觸發data事件,打印結果如下所示。 ~~~ 接收到 2 個字節的數據 he 接收到 2 個字節的數據 ll 接收到 2 個字節的數據 o 接收到 2 個字節的數據 No 接收到 2 個字節的數據 de 接收到 2 個字節的數據 .j 接收到 1 個字節的數據 s 結束接收 ~~~ &emsp;&emsp;可讀流還包含一個error事件,用于監聽異常,其事件處理程序會接收一個Error對象。在下面的示例中,會讀取不存在的文件,從而觸發error事件。 ~~~ const readable = fs.createReadStream('./demo.txt'); readable.on("error", (err) => { console.log(err); //打印錯誤信息 }); ~~~ **3)實現流** &emsp;&emsp;當實現自定義的流時,需要繼承四個抽象類中的一個,表1列出了四個抽象類需要實現的方法。 :-: ![](https://img.kancloud.cn/01/b2/01b2183c8208d353507a7bea6e20f31e_708x372.png) &emsp;&emsp;下面是一個自定義可寫流的例子,\_write()方法中的encoding是一個字符串,表示字符編碼。 ~~~ const { Writable } = require('stream'); class MyWritable extends Writable { constructor(options) { super(options); } _write(chunk, encoding, callback) { if (encoding === "buffer") { callback(); } } } ~~~ ## 三、EventEmitter &emsp;&emsp;Node的事件模塊目前只包含一個EventEmitter類(即事件觸發器),所有能觸發事件的對象都是EventEmitter類的實例。EventEmitter通常被用作基類,在Node內部,凡是提供事件機制的模塊都會繼承它。 &emsp;&emsp;在下面的示例中,聲明了一個EventEmitter實例,on()方法用于注冊監聽器,emit()方法用于觸發事件。在調用emit()方法時,傳遞了自定義的type參數。 ~~~ const EventEmitter = require('events'); class MyEmitter extends EventEmitter {} const myEmitter = new MyEmitter(); myEmitter.on('click', (type) => { console.log(`觸發${type}事件`); }); myEmitter.emit('click', "點擊"); ~~~ &emsp;&emsp;注意,可注冊多個相同名稱的事件,監聽器會按照添加順序依次調用。事件模塊還提供了很多其它方法,例如off()用于解除事件綁定,once()可以只監聽一次事件。 ***** > 原文出處: [博客園-Node.js躬行記](https://www.cnblogs.com/strick/category/1688575.html) [知乎專欄-Node.js躬行記](https://zhuanlan.zhihu.com/pwnode) 已建立一個微信前端交流群,如要進群,請先加微信號freedom20180706或掃描下面的二維碼,請求中需注明“看云加群”,在通過請求后就會把你拉進來。還搜集整理了一套[面試資料](https://github.com/pwstrick/daily),歡迎瀏覽。 ![](https://box.kancloud.cn/2e1f8ecf9512ecdd2fcaae8250e7d48a_430x430.jpg =200x200) 推薦一款前端監控腳本:[shin-monitor](https://github.com/pwstrick/shin-monitor),不僅能監控前端的錯誤、通信、打印等行為,還能計算各類性能參數,包括 FMP、LCP、FP 等。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看