最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js中的緩沖與流模塊詳細介紹

 更新時間:2015年02月11日 09:26:08   投稿:junjie  
這篇文章主要介紹了Node.js中的緩沖與流模塊詳細介紹,本文講解了緩沖(buffer)模塊、類:Buffer、寫入緩沖區(qū)、復制緩沖區(qū)、流模塊等內(nèi)容,需要的朋友可以參考下

緩沖(buffer)模塊

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

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

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

類:Buffer

Buffer 類是一個全局變量類型,用來直接處理2進制數(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)化,例如可以使用指定編碼將二進制數(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ù)量,這里的字母a的utf-8編碼占用1個字節(jié)。

復制緩沖區(qū)

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

復制代碼 代碼如下:

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類型的操作系統(tǒng)中,流是個標準的概念。有如下三個主要的流:

1.標準輸入
2.標準輸出
3.標準錯誤

可讀流

如果說,緩沖區(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ù)。當文件讀取完成后觸發(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)在,當接收到數(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ù)至一個目標的抽象。

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():強行滯留所有寫入。

滯留的數(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ù)寫入了
});

相關(guān)文章

  • Node.js的Mongodb使用實例

    Node.js的Mongodb使用實例

    本篇文章主要介紹了Node.js的Mongodb使用實例,具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12
  • Webpack打包構(gòu)建太慢試試這幾個提升打包速度方案

    Webpack打包構(gòu)建太慢試試這幾個提升打包速度方案

    在大型項目開發(fā)中,Webpack打包速度過慢會嚴重影響開發(fā)效率,本文介紹了幾種優(yōu)化Webpack打包速度的策略,包括減少文件搜索范圍、優(yōu)化Loader緩存、并行處理、減少打包體積、開發(fā)模式優(yōu)化以及插件優(yōu)化等,需要的朋友可以參考下
    2024-11-11
  • Node.js連接MySQL數(shù)據(jù)庫的操作步驟

    Node.js連接MySQL數(shù)據(jù)庫的操作步驟

    在現(xiàn)代 Web 開發(fā)中,與數(shù)據(jù)庫的交互是不可避免的一部分,Node.js提供了許多庫和模塊,使得連接和操作 MySQL 數(shù)據(jù)庫變得相對簡單,本文將介紹如何使用Node.js連接MySQL數(shù)據(jù)庫,并進行一些基本的操作,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • 詳細分析Node.js 模塊系統(tǒng)

    詳細分析Node.js 模塊系統(tǒng)

    這篇文章主要介紹了Node.js 模塊系統(tǒng)的的相關(guān)資料,文中講解非常詳細,供大家參考和學習,感興趣的朋友可以了解下
    2020-06-06
  • 解決node.js中bcrypt遇到的安裝問題

    解決node.js中bcrypt遇到的安裝問題

    這篇文章主要介紹了解決node.js中bcrypt遇到的安裝問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Node.js中防止錯誤導致的進程阻塞的方法

    Node.js中防止錯誤導致的進程阻塞的方法

    這篇文章主要介紹了Node.js中防止錯誤導致的進程阻塞的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • Node.js API詳解之 console模塊用法詳解

    Node.js API詳解之 console模塊用法詳解

    這篇文章主要介紹了Node.js API詳解之 console模塊用法,總結(jié)分析了Node.js API中console模塊基本函數(shù)、使用方法與操作注意事項,需要的朋友可以參考下
    2020-05-05
  • NodeJS實現(xiàn)微信公眾號關(guān)注后自動回復功能

    NodeJS實現(xiàn)微信公眾號關(guān)注后自動回復功能

    這篇文章主要為大家詳細介紹了NodeJS實現(xiàn)微信公眾號關(guān)注后自動回復功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Mac中安裝nvm的教程分享

    Mac中安裝nvm的教程分享

    下面小編就為大家分享一篇Mac中安裝nvm的教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • NodeJS讀取分析Nginx錯誤日志的方法

    NodeJS讀取分析Nginx錯誤日志的方法

    這篇文章主要介紹了NodeJS讀取分析Nginx錯誤日志的相關(guān)知識,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05

最新評論

石棉县| 体育| 芒康县| 安图县| 梅河口市| 健康| 始兴县| 东阳市| 康马县| 汝阳县| 定结县| 通化市| 怀宁县| 高邮市| 乐平市| 明溪县| 博白县| 安顺市| 措勤县| 盈江县| 千阳县| 贞丰县| 上栗县| 曲阳县| 舟曲县| 工布江达县| 宜良县| 邵阳县| 石狮市| 晋宁县| 灌云县| 怀仁县| 巩义市| 房产| 南部县| 资溪县| 呼图壁县| 古蔺县| 塔城市| 巩义市| 会东县|