国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

NodejsStream數(shù)據(jù)流使用手冊_node.js

來源:懂視網 責編:小采 時間:2020-11-27 20:53:31
文檔

NodejsStream數(shù)據(jù)流使用手冊_node.js

NodejsStream數(shù)據(jù)流使用手冊_node.js:1、介紹 本文介紹了使用 node.js streams 開發(fā)程序的基本方法。 We should have some ways of connecting programs like garden hose--screw in another segment when it becomes necessary to massage
推薦度:
導讀NodejsStream數(shù)據(jù)流使用手冊_node.js:1、介紹 本文介紹了使用 node.js streams 開發(fā)程序的基本方法。 We should have some ways of connecting programs like garden hose--screw in another segment when it becomes necessary to massage

1、介紹

本文介紹了使用 node.js streams 開發(fā)程序的基本方法。

最早接觸Stream是從早期的unix開始的數(shù)十年的實踐證明Stream 思想可以很簡單的開發(fā)出一些龐大的系統(tǒng)。在unix里,Stream是通過 |實現(xiàn)的;在node中,作為內置的stream模塊,很多核心模塊和三方模塊都使用到。和unix一樣,node Stream主要的操作也是.pipe(),使用者可以使用反壓力機制來控制讀和寫的平衡。

Stream 可以為開發(fā)者提供可以重復使用統(tǒng)一的接口,通過抽象的Stream接口來控制Stream之間的讀寫平衡。

2、為什么使用Stream

node中的I/O是異步的,因此對磁盤和網絡的讀寫需要通過回調函數(shù)來讀取數(shù)據(jù),下面是一個文件下載服務器的簡單代碼:

這些代碼可以實現(xiàn)需要的功能,但是服務在發(fā)送文件數(shù)據(jù)之前需要緩存整個文件數(shù)據(jù)到內存,如果"data.txt"文件很大且并發(fā)量很大的話,會浪費很多內存。因為用戶需要等到整個文件緩存到內存才能接受的文件數(shù)據(jù),這樣導致用戶體驗相當不好。不過還好(req, res)兩個參數(shù)都是Stream,這樣我們可以用fs.createReadStream()代替fs.readFile():

.pipe()方法監(jiān)聽fs.createReadStream()的'data' 和'end'事件,這樣"data.txt"文件就不需要緩存整個文件,當客戶端連接完成之后馬上可以發(fā)送一個數(shù)據(jù)塊到客戶端。使用.pipe()另一個好處是可以解決當客戶端延遲非常大時導致的讀寫不平衡問題。如果想壓縮文件再發(fā)送,可以使用三方模塊實現(xiàn):

這樣文件就會對支持gzip和deflate的瀏覽器進行壓縮。oppressor 模塊會處理所有的content-encoding。

Stream使開發(fā)程序變得簡單。

3、基礎概念

有五種基本的Stream: readable, writable, transform, duplex, and”classic”.

3-1、pipe

所有類型的Stream收是使用 .pipe() 來創(chuàng)建一個輸入輸出對,接收一個可讀流src并將其數(shù)據(jù)輸出到可寫流dst,如下:

.pipe( dst )方法為返回dst流,這樣就可以接連使用多個.pipe(),如下:

功能與下面的代碼相同:

3-2、readable streams

通過調用Readable streams的 .pipe()方法可以把Readable streams的數(shù)據(jù)寫入一個Writable , Transform, 或者Duplex stream。

1>創(chuàng)建 readable stream

這里我們創(chuàng)建一個readable stream!

rs.push( null ) 通知數(shù)據(jù)接收者數(shù)據(jù)已經發(fā)送完畢.

注意到我們在將所有數(shù)據(jù)內容壓入可讀流之前并沒有調用rs.pipe(process.stdout);,但是我們壓入的所有數(shù)據(jù)內容還是完全的輸出了,這是因為可讀流在接收者沒有讀取數(shù)據(jù)之前,會緩存所有壓入的數(shù)據(jù)。但是在很多情況下, 更好的方法是只有數(shù)據(jù)接收著請求數(shù)據(jù)的時候,才壓入數(shù)據(jù)到可讀流而不是緩存整個數(shù)據(jù)。下面我們重寫 一下._read()函數(shù):

上面的代碼通過重寫_read()方法實現(xiàn)了只有在數(shù)據(jù)接受者請求數(shù)據(jù)才向可讀流中壓入數(shù)據(jù)。_read()方法也可以接收一個size參數(shù)表示數(shù)據(jù)請求著請求的數(shù)據(jù)大小,但是可讀流可以根據(jù)需要忽略這個參數(shù)。

注意我們也可以用util.inherits()繼承可讀流。為了說明只有在數(shù)據(jù)接受者請求數(shù)據(jù)時_read()方法才被調用,我們在向可讀流壓入數(shù)據(jù)時做一個延時,如下:

用下面的命令運行程序我們發(fā)現(xiàn)_read()方法只調用了5次:

使用計時器的原因是系統(tǒng)需要時間來發(fā)送信號來通知程序關閉管道。使用process.stdout.on('error', fn) 是為了處理系統(tǒng)因為header命令關閉管道而發(fā)送SIGPIPE信號,因為這樣會導致process.stdout觸發(fā)EPIPE事件。如果想創(chuàng)建一個的可以壓入任意形式數(shù)據(jù)的可讀流,只要在創(chuàng)建流的時候設置參數(shù)objectMode為true即可,例如:Readable({ objectMode: true })。

2>讀取readable stream數(shù)據(jù)

大部分情況下我們只要簡單的使用pipe方法將可讀流的數(shù)據(jù)重定向到另外形式的流,但是在某些情況下也許直接從可讀流中讀取數(shù)據(jù)更有用。如下:

當可讀流中有數(shù)據(jù)可讀取時,流會觸發(fā)'readable' 事件,這樣就可以調用.read()方法來讀取相關數(shù)據(jù),當可讀流中沒有數(shù)據(jù)可讀取時,.read() 會返回null,這樣就可以結束.read() 的調用, 等待下一次'readable' 事件的觸發(fā)。下面是一個使用.read(n)從標準輸入每次讀取3個字節(jié)的例子:

如下運行程序發(fā)現(xiàn),輸出結果并不完全!

這是應為額外的數(shù)據(jù)數(shù)據(jù)留在流的內部緩沖區(qū)里了,而我們需要通知流我們要讀取更多的數(shù)據(jù).read(0)可以達到這個目的。

這次運行結果如下:

我們可以使用 .unshift() 將數(shù)據(jù)重新押回流數(shù)據(jù)隊列的頭部,這樣可以接續(xù)讀取押回的數(shù)據(jù)。如下面的代碼,會按行輸出標準輸入的內容:

當然,有很多模塊可以實現(xiàn)這個功能,如:split 。

3-3、writable streams

writable streams只可以作為.pipe()函數(shù)的目的參數(shù)。如下代碼:

1>創(chuàng)建 writable stream

重寫 ._write(chunk, enc, next) 方法就可以接受一個readable stream的數(shù)據(jù)。

第一個參數(shù)chunk是數(shù)據(jù)輸入者寫入的數(shù)據(jù)。第二個參數(shù)end是數(shù)據(jù)的編碼格式。第三個參數(shù)next(err)通過回調函數(shù)通知數(shù)據(jù)寫入者可以寫入更多的時間。如果readable stream寫入的是字符串,那么字符串會默認轉換為Buffer,如果在創(chuàng)建流的時候設置Writable({ decodeStrings: false })參數(shù),那么不會做轉換。如果readable stream寫入的數(shù)據(jù)時對象,那么需要這樣創(chuàng)建writable stream

2>寫數(shù)據(jù)到 writable stream

調用writable stream的.write(data)方法即可完成數(shù)據(jù)寫入。

調用.end()方法通知writable stream 數(shù)據(jù)已經寫入完成。

如果需要設置writable stream的緩沖區(qū)的大小,那么在創(chuàng)建流的時候,需要設置opts.highWaterMark,這樣如果緩沖區(qū)里的數(shù)據(jù)超過opts.highWaterMark,.write(data)方法會返回false。當緩沖區(qū)可寫的時候,writable stream會觸發(fā)'drain' 事件。

3-4、classic streams

Classic streams比較老的接口了,最早出現(xiàn)在node 0.4版本中,但是了解一下其運行原理還是十分有好
處的。當一個流被注冊了"data" 事件的回到函數(shù),那么流就會工作在老版本模式下,即會使用老的API。

1>classic readable streams

Classic readable streams事件就是一個事件觸發(fā)器,如果Classic readable streams有數(shù)據(jù)可讀取,那么其觸發(fā) "data" 事件,等到數(shù)據(jù)讀取完畢時,會觸發(fā)"end" 事件。.pipe() 方法通過檢查stream.readable 的值確定流是否有數(shù)據(jù)可讀。下面是一個使用Classic readable streams打印A-J字母的例子:

如果要從classic readable stream中讀取數(shù)據(jù),注冊"data" 和"end"兩個事件的回調函數(shù)即可,代碼如下:

需要注意的是如果你使用這種方式讀取數(shù)據(jù),那么會失去使用新接口帶來的好處。比如你在往一個 延遲非常大的流寫數(shù)據(jù)時,需要注意讀取數(shù)據(jù)和寫數(shù)據(jù)的平衡問題,否則會導致大量數(shù)據(jù)緩存在內存中,導致浪費大量內存。一般這時候強烈建議使用流的.pipe()方法,這樣就不用自己監(jiān)聽”data” 和”end”事件了,也不用擔心讀寫不平衡的問題了。當然你也可以用 through代替自己監(jiān)聽”data” 和”end” 事件,如下面的代碼:

或者也可以使用concat-stream來緩存整個流的內容:

當然如果你非要自己監(jiān)聽"data" 和"end"事件,那么你可以在寫數(shù)據(jù)的流不可寫的時候使用.pause()方法暫停Classic readable streams繼續(xù)觸發(fā)”data” 事件。等到寫數(shù)據(jù)的流可寫的時候再使用.resume() 方法通知流繼續(xù)觸發(fā)"data" 事件繼續(xù)讀取
數(shù)據(jù)。

2>classic writable streams

Classic writable streams 非常簡單。只有 .write(buf), .end(buf)和.destroy()三個方法。.end(buf) 方法的buf參數(shù)是可選的,如果選擇該參數(shù),相當于stream.write(buf); stream.end() 這樣的操作,需要注意的是當流的緩沖區(qū)寫滿即流不可寫時.write(buf)方法會返回false,如果流再次可寫時,流會觸發(fā)drain事件。

4、transform

transform是一個對讀入數(shù)據(jù)過濾然輸出的流。

5、duplex

duplex stream是一個可讀也可寫的雙向流,如下面的a就是一個duplex stream:

以上內容是小編給大家介紹的Nodejs Stream 數(shù)據(jù)流使用手冊,希望對大家有所幫助!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

NodejsStream數(shù)據(jù)流使用手冊_node.js

NodejsStream數(shù)據(jù)流使用手冊_node.js:1、介紹 本文介紹了使用 node.js streams 開發(fā)程序的基本方法。 We should have some ways of connecting programs like garden hose--screw in another segment when it becomes necessary to massage
推薦度:
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 在线观看视频国产 | 日韩在线一区二区三区免费视频 | 欧美色老头 | 精品久久一区二区三区 | 日韩国产在线观看 | 欧美日韩亚洲v在线观看 | 日韩va亚洲va欧美va浪潮 | 久久久久久亚洲精品不卡 | 久久久久久国产精品免费 | 国产每日更新 | 国产一级成人毛片 | 日韩 国产 欧美 | 国产一区二区三区日韩欧美 | 欧美日韩另类综合 | 国产一区亚洲二区 | 国产成人高清一区二区私人 | 亚洲一区二区成人 | 亚洲视频在线一区 | 交换国产精品视频一区 | 自拍偷拍 欧美日韩 | 亚洲欧美日韩国产综合高清 | 国产成人99久久亚洲综合精品 | 草b视频在线观看 | 一级大毛片 | 日韩专区亚洲综合久久 | 欧美高清视频一区 | 91精品国产91久久 | 伊人婷婷在线 | 国内精品久久久久久久aa护士 | 在线免费观看国产 | 国产码欧美日韩高清综合一区 | 91精品国产综合久久久久久 | 日韩在线视频线视频免费网站 | 欧美日韩免费一区二区在线观看 | 欧美在线中文 | 日韩午夜视频在线观看 | 国产欧美日韩视频在线观看 | 欧美日韩精品在线观看 | 欧美人在线一区二区三区 | 日韩v欧美 | 国产成人久久精品一区二区三区 |