国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Node.js知識點(diǎn)詳解(三)緩沖與流模塊

plus2047 / 1403人閱讀

摘要:緩沖模塊起初就是為瀏覽器而設(shè)計的,所以能很好的處理編碼的字符串,但不能很好的處理二進(jìn)制數(shù)據(jù)。有如下三個主要的流標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸出標(biāo)準(zhǔn)錯誤可讀流如果說,緩沖區(qū)是處理原始數(shù)據(jù)的方式的話,那么流通常是移動數(shù)據(jù)的方式。該方法讓可讀流繼續(xù)觸發(fā)事件。

緩沖(buffer)模塊

js起初就是為瀏覽器而設(shè)計的,所以能很好的處理unicode編碼的字符串,但不能很好的處理二進(jìn)制數(shù)據(jù)。這是Node.js的一個問題,因為Node.js旨在網(wǎng)絡(luò)上發(fā)送和接收經(jīng)常是以二進(jìn)制格式傳輸?shù)臄?shù)據(jù)。比如:

 - 通過TCP連接發(fā)送和接收數(shù)據(jù);
 - 從圖像或者壓縮文件讀取二進(jìn)制數(shù)據(jù);
 - 從文件系統(tǒng)讀寫數(shù)據(jù);
 - 處理來自網(wǎng)絡(luò)的二進(jìn)制數(shù)據(jù)流

Buffer模塊為Node.js帶來了一種存儲原始數(shù)據(jù)的方法,于是可以再js的上下文中使用二進(jìn)制數(shù)據(jù)。每當(dāng)需要在Node.js中處理I/O操作中移動的數(shù)據(jù)時,就有可能使用Buffer模塊。

類:Buffer

Buffer 類是一個全局變量類型,用來直接處理2進(jìn)制數(shù)據(jù)的。 它能夠使用多種方式構(gòu)建。

原始數(shù)據(jù)保存在 Buffer 類的實例中。一個 Buffer 實例類似于一個整數(shù)數(shù)組

1.new Buffer(size):分配一個新的 buffer 大小是 size 的8位字節(jié). 
2.new Buffer(array):分配一個新的 buffer 使用一個8位字節(jié) array 數(shù)組. 
3.new Buffer(str, [encoding]):encoding String類型 - 使用什么編碼方式,參數(shù)可選.

4.類方法: Buffer.isEncoding(encoding):如果給定的編碼 encoding 是有效的,返回 true,否則返回 false。 
5.類方法: Buffer.isBuffer(obj):測試這個 obj 是否是一個 Buffer. 返回Boolean
6.類方法: Buffer.concat(list, [totalLength]):list {Array}數(shù)組類型,Buffer數(shù)組,用于被連接。totalLength {Number}類型 上述Buffer數(shù)組的所有Buffer的總大小。

除了可以讀取文件得到Buffer的實例外,還能夠直接構(gòu)造,例如:

var bin = new Buffer([ 0x48, 0x65, 0x6c, 0x6c, 0x6c ]);

Buffer與字符串類似,除了可以用.length屬性得到字節(jié)長度外,還可以用[index]方式讀取指定位置的字節(jié),例如:

bin[0]; // => 0x48;

Buffer與字符串能夠互相轉(zhuǎn)化,例如可以使用指定編碼將二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為字符串:

var str = bin.toString("utf-8"); // => "hello"

.slice方法不是返回一個新的Buffer,而更像是返回了指向原Buffer中間的某個位置的指針,如下所示。

1.[ 0x48, 0x65, 0x6c, 0x6c, 0x6c ]
2.    ^           ^
3.    |           |
4.   bin     bin.slice(2)
寫入緩沖區(qū)
var buffer = new Buffer(8);//創(chuàng)建一個分配了8個字節(jié)內(nèi)存的緩沖區(qū)
console.log(buffer.write("a","utf8"));//輸出1

這會將字符"a"寫入緩沖區(qū),node返回經(jīng)過編碼以后寫入緩沖區(qū)的字節(jié)數(shù)量,這里的字母autf-8編碼占用1個字節(jié)。

復(fù)制緩沖區(qū)

Node.js提供了一個將Buffer對象整體內(nèi)容復(fù)制到另一個Buffer對象中的方法。我們只能在已經(jīng)存在的Buffer對象之間復(fù)制,所以必須創(chuàng)建它們。

buffer.copy(bufferToCopyTo)

其中,bufferToCopyTo是要復(fù)制的目標(biāo)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類型的操作系統(tǒng)中,流是個標(biāo)準(zhǔn)的概念。有如下三個主要的流:

1.標(biāo)準(zhǔn)輸入
2.標(biāo)準(zhǔn)輸出
3.標(biāo)準(zhǔn)錯誤
可讀流

如果說,緩沖區(qū)是Node.js處理原始數(shù)據(jù)的方式的話,那么流通常是Node.js移動數(shù)據(jù)的方式。Node.js中的流是可讀的或者可寫的。Node.js中許多模塊都使用了流,包括HTTP和文件系統(tǒng)。

假設(shè)我們創(chuàng)建一個classmates.txt的文件,并從中讀入姓名清單,以便使用這些數(shù)據(jù)。由于數(shù)據(jù)是流,這就意味著完成文件讀取之前,從收到最初幾個字節(jié)開始,就可以對數(shù)據(jù)動作,這是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")
});

在以上示例中,在收到新數(shù)據(jù)時觸發(fā)事件數(shù)據(jù)。當(dāng)文件讀取完成后觸發(fā)關(guān)閉事件。

可寫流

顯然,我們也可以創(chuàng)建可寫流以便寫數(shù)據(jù)。這意味著,只要一段簡單的腳本,就可以使用流讀入文件然后寫入另一個文件:

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();
});

現(xiàn)在,當(dāng)接收到數(shù)據(jù)事件時,數(shù)據(jù)會被寫入可寫流中。

readable.setEncoding(encoding):返回: this

readable.resume():同上。該方法讓可讀流繼續(xù)觸發(fā) data 事件。 

readable.pause():同上。該方法會使一個處于流動模式的流停止觸發(fā) data 事件,切換到非流動模式,并讓后續(xù)可用數(shù)據(jù)留在內(nèi)部緩沖區(qū)中。 
類: stream.Writable

Writable(可寫)流接口是對您正在寫入數(shù)據(jù)至一個目標(biāo)的抽象。

1.writable.write(chunk, [encoding], [callback]):

chunk {String | Buffer} 要寫入的數(shù)據(jù)
encoding {String} 編碼,假如 chunk 是一個字符串
callback {Function} 數(shù)據(jù)塊寫入后的回調(diào)
返回: {Boolean} 如果數(shù)據(jù)已被全部處理則 true。

該方法向底層系統(tǒng)寫入數(shù)據(jù),并在數(shù)據(jù)被處理完畢后調(diào)用所給的回調(diào)。

2.writable.cork():強(qiáng)行滯留所有寫入。 

滯留的數(shù)據(jù)會在 .uncork().end() 調(diào)用時被寫入。

3.writable.end([chunk], [encoding], [callback])

chunk {String | Buffer} 可選,要寫入的數(shù)據(jù)
encoding {String} 編碼,假如 chunk 是一個字符串
callback {Function} 可選,流結(jié)束后的回調(diào)

在調(diào)用 end() 后調(diào)用 write() 會產(chǎn)生錯誤。

// 寫入 "hello, " 然后以 "world!" 結(jié)束
http.createServer(function (req, res) {
  res.write("hello, ");
  res.end("world!");
  // 現(xiàn)在不允許繼續(xù)寫入了
});

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/85468.html

相關(guān)文章

  • nodeJs文件系統(tǒng)(fs)與流(stream)

    摘要:異步文件系統(tǒng)不會阻塞程序的執(zhí)行,而是在操作完成時,通過回調(diào)函數(shù)將結(jié)果返回。 文件系統(tǒng)(File System): 在Node中,文件系統(tǒng)的交互是非常重要的,服務(wù)器的本質(zhì)就是將本地的文件發(fā)送給客戶端, Node通過fs模塊來和文件系統(tǒng)進(jìn)行交互,該模塊提供了一些標(biāo)準(zhǔn)的文件訪問API類打開、讀取、寫入文件、以及與其交互。 要是用fs模塊,首先要從核心模塊中加載; 使用 const fs= ...

    0x584a 評論0 收藏0
  • 后端識點(diǎn)總結(jié)——NODE.JS基礎(chǔ)

    摘要:后端知識點(diǎn)總結(jié)基礎(chǔ)不是是一種軟件開發(fā)平臺,它的競爭對象歷史第一次有一種語言可以通吃前后端網(wǎng)站阿里云鏡像版本年初年中年底最新版本功能強(qiáng)大可靠,適合大型企業(yè)級項目簡單易用適合互聯(lián)網(wǎng)項目易用適合平臺性能好適合服務(wù)器端密集型項目不適合密集型項目密集 后端知識點(diǎn)總結(jié)——NODE.JS基礎(chǔ) 1.Node.js Node.js不是JS,是一種軟件開發(fā)平臺,它的競爭對象JSP/PHP/ASP.NET...

    Freeman 評論0 收藏0
  • Node.js - 200 多行代碼實現(xiàn) Websocket 協(xié)議

    摘要:預(yù)備工作序最近正在研究相關(guān)的知識,想著如何能自己實現(xiàn)協(xié)議。監(jiān)聽事件就是協(xié)議的抽象,直接在上面監(jiān)聽已有的事件和事件這兩個事件。表示當(dāng)前數(shù)據(jù)幀為消息的最后一個數(shù)據(jù)幀,此時接收方已經(jīng)收到完整的消息,可以對消息進(jìn)行處理。 A、預(yù)備工作 1、序 最近正在研究 Websocket 相關(guān)的知識,想著如何能自己實現(xiàn) Websocket 協(xié)議。到網(wǎng)上搜羅了一番資料后用 Node.js 實現(xiàn)該協(xié)議,倒也沒...

    張巨偉 評論0 收藏0
  • Deno 兼容瀏覽器具體指的是什么?

    摘要:里面有一句描述,可以看到的目標(biāo)是兼容瀏覽器。那么這里的兼容瀏覽器到底如何是什么意思呢我簡單談?wù)勎业睦斫獍伞:芏嗳诉€有誤解以為兼容瀏覽器指的是會提供類似里的寫法。 Deno 里面有一句描述:Aims to be browser compatible,可以看到 Deno 的目標(biāo)是兼容瀏覽器。那么這里的兼容瀏覽器到底如何是什么意思呢? 我簡單談?wù)勎业睦斫獍伞?首先這里的兼容性肯定不是 Den...

    Yangyang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<