摘要:緩沖模塊起初就是為瀏覽器而設計的,所以能很好的處理編碼的字符串,但不能很好的處理二進制數據。有如下三個主要的流標準輸入標準輸出標準錯誤可讀流如果說,緩沖區是處理原始數據的方式的話,那么流通常是移動數據的方式。該方法讓可讀流繼續觸發事件。
緩沖(buffer)模塊
js起初就是為瀏覽器而設計的,所以能很好的處理unicode編碼的字符串,但不能很好的處理二進制數據。這是Node.js的一個問題,因為Node.js旨在網絡上發送和接收經常是以二進制格式傳輸的數據。比如:
- 通過TCP連接發送和接收數據; - 從圖像或者壓縮文件讀取二進制數據; - 從文件系統讀寫數據; - 處理來自網絡的二進制數據流
而Buffer模塊為Node.js帶來了一種存儲原始數據的方法,于是可以再js的上下文中使用二進制數據。每當需要在Node.js中處理I/O操作中移動的數據時,就有可能使用Buffer模塊。
類:BufferBuffer 類是一個全局變量類型,用來直接處理2進制數據的。 它能夠使用多種方式構建。
原始數據保存在 Buffer 類的實例中。一個 Buffer 實例類似于一個整數數組
1.new Buffer(size):分配一個新的 buffer 大小是 size 的8位字節. 2.new Buffer(array):分配一個新的 buffer 使用一個8位字節 array 數組. 3.new Buffer(str, [encoding]):encoding String類型 - 使用什么編碼方式,參數可選. 4.類方法: Buffer.isEncoding(encoding):如果給定的編碼 encoding 是有效的,返回 true,否則返回 false。 5.類方法: Buffer.isBuffer(obj):測試這個 obj 是否是一個 Buffer. 返回Boolean 6.類方法: Buffer.concat(list, [totalLength]):list {Array}數組類型,Buffer數組,用于被連接。totalLength {Number}類型 上述Buffer數組的所有Buffer的總大小。
除了可以讀取文件得到Buffer的實例外,還能夠直接構造,例如:
var bin = new Buffer([ 0x48, 0x65, 0x6c, 0x6c, 0x6c ]);
Buffer與字符串類似,除了可以用.length屬性得到字節長度外,還可以用[index]方式讀取指定位置的字節,例如:
bin[0]; // => 0x48;
Buffer與字符串能夠互相轉化,例如可以使用指定編碼將二進制數據轉化為字符串:
var str = bin.toString("utf-8"); // => "hello"
.slice方法不是返回一個新的Buffer,而更像是返回了指向原Buffer中間的某個位置的指針,如下所示。
1.[ 0x48, 0x65, 0x6c, 0x6c, 0x6c ] 2. ^ ^ 3. | | 4. bin bin.slice(2)寫入緩沖區
var buffer = new Buffer(8);//創建一個分配了8個字節內存的緩沖區 console.log(buffer.write("a","utf8"));//輸出1
這會將字符"a"寫入緩沖區,node返回經過編碼以后寫入緩沖區的字節數量,這里的字母a的utf-8編碼占用1個字節。
復制緩沖區Node.js提供了一個將Buffer對象整體內容復制到另一個Buffer對象中的方法。我們只能在已經存在的Buffer對象之間復制,所以必須創建它們。
buffer.copy(bufferToCopyTo)
其中,bufferToCopyTo是要復制的目標Buffer對象。如下示例:
var buffer1 = new Buffer(8); buffer1.write("nice to meet u","utf8"); var buffer2 = new Buffer(8); buffer1.copy(buffer2); console.log(buffer2.toString());//nice to meet u流模塊
在UNIX類型的操作系統中,流是個標準的概念。有如下三個主要的流:
1.標準輸入 2.標準輸出 3.標準錯誤可讀流
如果說,緩沖區是Node.js處理原始數據的方式的話,那么流通常是Node.js移動數據的方式。Node.js中的流是可讀的或者可寫的。Node.js中許多模塊都使用了流,包括HTTP和文件系統。
假設我們創建一個classmates.txt的文件,并從中讀入姓名清單,以便使用這些數據。由于數據是流,這就意味著完成文件讀取之前,從收到最初幾個字節開始,就可以對數據動作,這是Node.js中的一個常見模式:
var fs = require("fs"); var stream = fs.ReadStream("classmates.txt"); stream.setEncoding("utf8"); stream.on("data", function (chunk) { console.log("read some data") }); stream.on("close", function () { console.log("all the data is read") });
在以上示例中,在收到新數據時觸發事件數據。當文件讀取完成后觸發關閉事件。
可寫流顯然,我們也可以創建可寫流以便寫數據。這意味著,只要一段簡單的腳本,就可以使用流讀入文件然后寫入另一個文件:
var fs = require("fs"); var readableStream = fs.ReadStream("classmates.txt"); var writableStream = fs.writeStream("names.txt"); readableStream.setEncoding("utf8"); readableStream.on("data", function (chunk) { writableStream.write(chunk); }); readableStream.on("close", function () { writableStream.end(); });
現在,當接收到數據事件時,數據會被寫入可寫流中。
readable.setEncoding(encoding):返回: this readable.resume():同上。該方法讓可讀流繼續觸發 data 事件。 readable.pause():同上。該方法會使一個處于流動模式的流停止觸發 data 事件,切換到非流動模式,并讓后續可用數據留在內部緩沖區中。類: stream.Writable
Writable(可寫)流接口是對您正在寫入數據至一個目標的抽象。
1.writable.write(chunk, [encoding], [callback]): chunk {String | Buffer} 要寫入的數據 encoding {String} 編碼,假如 chunk 是一個字符串 callback {Function} 數據塊寫入后的回調 返回: {Boolean} 如果數據已被全部處理則 true。
該方法向底層系統寫入數據,并在數據被處理完畢后調用所給的回調。
2.writable.cork():強行滯留所有寫入。
滯留的數據會在 .uncork() 或 .end() 調用時被寫入。
3.writable.end([chunk], [encoding], [callback]) chunk {String | Buffer} 可選,要寫入的數據 encoding {String} 編碼,假如 chunk 是一個字符串 callback {Function} 可選,流結束后的回調
在調用 end() 后調用 write() 會產生錯誤。
// 寫入 "hello, " 然后以 "world!" 結束 http.createServer(function (req, res) { res.write("hello, "); res.end("world!"); // 現在不允許繼續寫入了 });
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85468.html
摘要:異步文件系統不會阻塞程序的執行,而是在操作完成時,通過回調函數將結果返回。 文件系統(File System): 在Node中,文件系統的交互是非常重要的,服務器的本質就是將本地的文件發送給客戶端, Node通過fs模塊來和文件系統進行交互,該模塊提供了一些標準的文件訪問API類打開、讀取、寫入文件、以及與其交互。 要是用fs模塊,首先要從核心模塊中加載; 使用 const fs= ...
摘要:后端知識點總結基礎不是是一種軟件開發平臺,它的競爭對象歷史第一次有一種語言可以通吃前后端網站阿里云鏡像版本年初年中年底最新版本功能強大可靠,適合大型企業級項目簡單易用適合互聯網項目易用適合平臺性能好適合服務器端密集型項目不適合密集型項目密集 后端知識點總結——NODE.JS基礎 1.Node.js Node.js不是JS,是一種軟件開發平臺,它的競爭對象JSP/PHP/ASP.NET...
摘要:預備工作序最近正在研究相關的知識,想著如何能自己實現協議。監聽事件就是協議的抽象,直接在上面監聽已有的事件和事件這兩個事件。表示當前數據幀為消息的最后一個數據幀,此時接收方已經收到完整的消息,可以對消息進行處理。 A、預備工作 1、序 最近正在研究 Websocket 相關的知識,想著如何能自己實現 Websocket 協議。到網上搜羅了一番資料后用 Node.js 實現該協議,倒也沒...
摘要:里面有一句描述,可以看到的目標是兼容瀏覽器。那么這里的兼容瀏覽器到底如何是什么意思呢我簡單談談我的理解吧。很多人還有誤解以為兼容瀏覽器指的是會提供類似里的寫法。 Deno 里面有一句描述:Aims to be browser compatible,可以看到 Deno 的目標是兼容瀏覽器。那么這里的兼容瀏覽器到底如何是什么意思呢? 我簡單談談我的理解吧。 首先這里的兼容性肯定不是 Den...
閱讀 1325·2023-04-26 00:10
閱讀 2428·2021-09-22 15:38
閱讀 3746·2021-09-22 15:13
閱讀 3503·2019-08-30 13:11
閱讀 646·2019-08-30 11:01
閱讀 3028·2019-08-29 14:20
閱讀 3208·2019-08-29 13:27
閱讀 1726·2019-08-29 11:33