亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

淺析Node.js 中 Stream API 的使用

2024-05-06 16:24:52
字體:
來源:轉載
供稿:網友

這篇文章給大家淺析node.js中stream api的使用,本文介紹的非常詳細,涉及到node.js api,node.js stream相關知識,感興趣的朋友可以參考下

本文由淺入深給大家介紹node.js stream api,具體詳情請看下文吧。

基本介紹

在 Node.js 中,讀取文件的方式有兩種,一種是用 fs.readFile ,另外一種是利用 fs.createReadStream 來讀取。

fs.readFile 對于每個 Node.js 使用者來說最熟悉不過了,簡單易懂,很好上手。但它的缺點是會先將數據全部讀入內存,一旦遇到大文件的時候,這種方式讀取的效率就非常低下了。

而 fs.createReadStream 則是通過 Stream 來讀取數據,它會把文件(數據)分割成小塊,然后觸發一些特定的事件,我們可以監聽這些事件,編寫特定的處理函數。這種方式相對上面來說,并不好上手,但它效率非常高。

事實上, Stream 在 Node.js 中并非僅僅用在文件處理上,其他地方也可以看到它的身影,如 process.stdin/stdout , http , tcp sockets , zlib , crypto 等都有用到。

本文是我學習 Node.js 中的 Stream API 中的一點總結,希望對大家有用。

特點

基于事件通訊

可以通過 pipe 來連接流

種類

Readable Stream 可讀數據流

Writeable Stream 可寫數據流

Duplex Stream 雙向數據流,可以同時讀和寫

Transform Stream 轉換數據流,可讀可寫,同時可以轉換(處理)數據

事件

可讀數據流的事件

readable 數據向外流時觸發

data 對于那些沒有顯式暫停的數據流,添加data事件監聽函數,會將數據流切換到流動態,盡快向外提供數據

end 讀取完數據時觸發。注意不能和 writeableStream.end() 混淆,writeableStream 并沒有 end 事件,只有 .end() 方法

close 數據源關閉時觸發

error 讀取數據發生錯誤時觸發

可寫數據流的事件

drain writable.write(chunk) 返回 false 之后,緩存全部寫入完成,可以重新寫入時就會觸發

finish 調用 .end 方法時,所有緩存的數據釋放后觸發,類似于可讀數據流中的 end 事件,表示寫入過程結束

pipe 作為 pipe 目標時觸發

unpipe 作為 unpipe 目標時觸發

error 寫入數據發生錯誤時觸發

狀態

可讀數據流有兩種狀態: 流動態 和 暫停態 ,改變數據流狀態的方法如下:

暫停態 -> 流動態

添加 data 事件的監聽函數

調用 resume 方法

調用 pipe 方法

注意:如果轉為流動態時,沒有 data 事件的監聽函數,也沒有 pipe 方法的目的地,那么數據將遺失。

流動態 -> 暫停態

不存在 pipe 方法的目的地時,調用 pause 方法

存在 pipe 方法的目的地時,移除所有 data 事件的監聽函數,并且調用 unpipe 方法,移除所有 pipe 方法的目的地

注意:只移除 data 事件的監聽函數,并不會自動引發數據流進入「暫停態」。另外,存在 pipe 方法的目的地時,調用 pause 方法,并不能保證數據流總是處于暫停態,一旦那些目的地發出數據請求,數據流有可能會繼續提供數據。

用法

讀寫文件

 

 
  1. var fs = require('fs'); 
  2. // 新建可讀數據流 
  3. var rs = fs.createReadStream('./test1.txt'); 
  4. // 新建可寫數據流 
  5. var ws = fs.createWriteStream('./test2.txt'); 
  6. // 監聽可讀數據流結束事件 
  7. rs.on('end'function() { 
  8. console.log('read text1.txt successfully!'); 
  9. }); 
  10. // 監聽可寫數據流結束事件 
  11. ws.on('finish'function() { 
  12. console.log('write text2.txt successfully!'); 
  13. }); 
  14. // 把可讀數據流轉換成流動態,流進可寫數據流中 
  15. rs.pipe(ws); 
  16. 讀取 CSV 文件,并上傳數據(我在生產環境中寫過) 
  17. var fs = require('fs'); 
  18. var es = require('event-stream'); 
  19. var csv = require('csv'); 
  20. var parser = csv.parse(); 
  21. var transformer = csv.transform(function(record) { 
  22. return record.join(','); 
  23. }); 
  24. var data = fs.createReadStream('./demo.csv'); 
  25. data 
  26. .pipe(parser) 
  27. .pipe(transformer) 
  28. // 處理前一個 stream 傳遞過來的數據 
  29. .pipe(es.map(function(data, callback) { 
  30. upload(data, function(err) { 
  31. callback(err); 
  32. }); 
  33. })) 
  34. // 相當于監聽前一個 stream 的 end 事件 
  35. .pipe(es.wait(function(err, body) { 
  36. process.stdout.write('done!'); 
  37. })); 

更多用法

可以參考一下https://github.com/jeresig/node-stream-playground,進去示例網站之后直接點 add stream 就能看到結果了。

常見坑

用 rs.pipe(ws) 的方式來寫文件并不是把 rs 的內容 append 到 ws 后面,而是直接用 rs 的內容覆蓋 ws 原有的內容

已結束/關閉的流不能重復使用,必須重新創建數據流

pipe 方法返回的是目標數據流,如 a.pipe(b) 返回的是 b,因此監聽事件的時候請注意你監聽的對象是否正確

如果你要監聽多個數據流,同時你又使用了 pipe 方法來串聯數據流的話,你就要寫成:

data

 

 
  1. .on('end'function() { 
  2. console.log('data end'); 
  3. }) 
  4. .pipe(a) 
  5. .on('end'function() { 
  6. console.log('a end'); 
  7. }) 
  8. .pipe(b) 
  9. .on('end'function() { 
  10. console.log('b end'); 
  11. }); 

常用類庫

event-stream 用起來有函數式編程的感覺,個人比較喜歡

awesome-nodejs#streams 由于其他 stream 庫我都沒用過,所以有需求的就直接看這里吧

以上內容是小編給大家介紹的Node.js 中 Stream API 的使用,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人激情在线| 色偷偷噜噜噜亚洲男人的天堂| 欧美日韩亚洲网| 国内免费久久久久久久久久久| 91免费人成网站在线观看18| 久久综合久中文字幕青草| 亚洲嫩模很污视频| 欧美精品做受xxx性少妇| 精品国产欧美一区二区五十路| 91禁外国网站| 久久久久久久999精品视频| 欧美亚洲国产日本| 欧美亚洲在线视频| 日韩av免费在线观看| 国产精品老女人精品视频| 91视频国产高清| 97久久精品国产| 亚洲精品一二区| 国产欧美一区二区三区视频| 亚洲综合视频1区| 欧美日韩综合视频网址| 九色91av视频| 成人a在线视频| 国产经典一区二区| 日韩成人av网址| 亚洲欧美国产一区二区三区| 中文字幕九色91在线| 亚洲第一av在线| 91九色视频导航| 国产999精品视频| 国产精品入口日韩视频大尺度| 亚洲成人激情在线| 午夜精品99久久免费| 欧美视频专区一二在线观看| 一区二区中文字幕| 亚洲成年人影院在线| 91啪国产在线| 亚洲精品av在线播放| 亚洲va欧美va国产综合久久| 国产日韩精品综合网站| 国产主播喷水一区二区| 亚洲日本中文字幕免费在线不卡| 一本色道久久综合亚洲精品小说| 欧美日韩性视频| 亚洲欧洲国产伦综合| 日韩一二三在线视频播| 欧美国产亚洲精品久久久8v| 精品magnet| 色偷偷偷亚洲综合网另类| 日韩欧美精品中文字幕| 国产一区深夜福利| 亚洲精品久久久久国产| 国产精品6699| 91chinesevideo永久地址| 尤物九九久久国产精品的分类| 国产午夜精品理论片a级探花| 亚洲成人网在线观看| 亚洲高清色综合| 欧美性猛交视频| 亚洲电影免费观看高清完整版在线| 尤物九九久久国产精品的特点| 亚洲成人在线视频播放| 国产精品青青在线观看爽香蕉| 欧美在线视频免费| 日日噜噜噜夜夜爽亚洲精品| 奇门遁甲1982国语版免费观看高清| 国产精品视频精品视频| 成人女保姆的销魂服务| 国产午夜精品全部视频在线播放| 欧美放荡办公室videos4k| 亚洲成人久久网| 美日韩在线视频| 国产一区二区三区日韩欧美| 日本欧美爱爱爱| 4438全国亚洲精品在线观看视频| 精品一区二区三区四区| 国产日韩在线精品av| 欧美视频国产精品| 日本久久久a级免费| 亚洲aⅴ日韩av电影在线观看| 国产做受69高潮| 亚洲第一精品自拍| 国产一区二区色| 国产精品高清在线观看| 成人午夜两性视频| 美女精品视频一区| 日本中文字幕久久看| 欧美另类xxx| 亚洲精品一区二区三区婷婷月| 国产一区二区三区精品久久久| 国产精品久久久久久久久免费| 国产精品久久一区| 亚洲精品一区中文| 91久久国产精品| 国产一区二区三区欧美| 在线视频欧美性高潮| 国产精品白嫩美女在线观看| 欧美成人中文字幕| 久久综合伊人77777蜜臀| 国产一区二区欧美日韩| 亚洲国产日韩欧美在线动漫| 在线视频欧美日韩精品| 中文字幕最新精品| 国产欧美日韩综合精品| 欧美日韩亚洲一区二| 欧美性videos高清精品| 国产亚洲成av人片在线观看桃| 欧美在线中文字幕| 国产自产女人91一区在线观看| 91在线精品视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美日韩美女在线| 国产高清视频一区三区| 亚洲www在线| 日韩av资源在线播放| 国内外成人免费激情在线视频| 亚洲一区二区少妇| 国产欧美精品xxxx另类| 欧美精品videosex牲欧美| 中文字幕一区二区精品| 日韩欧美一区二区三区| 在线观看国产精品日韩av| 美女视频久久黄| 97视频在线观看视频免费视频| 精品久久久国产精品999| 国产精品亚洲网站| 国产欧美日韩中文| 亚洲国产成人在线播放| 精品久久久久久中文字幕一区奶水| 国产精品久久久久免费a∨大胸| 久久免费国产精品1| 91精品国产自产在线观看永久| 国产精品福利小视频| 日韩在线精品视频| 日韩精品中文字| 久久久久久久久国产| 国外成人在线视频| 最近2019中文免费高清视频观看www99| 欧美日韩亚洲精品内裤| 亚洲一区二区免费在线| 91高潮在线观看| 国产精品狼人色视频一区| 久久久久久久久久久久久久久久久久av| 亚洲精品天天看| 日韩欧美视频一区二区三区| 色999日韩欧美国产| 久久91亚洲精品中文字幕| 疯狂蹂躏欧美一区二区精品| 国产精品久久久久久久久久三级| 在线a欧美视频| 日韩欧美极品在线观看| 国模精品视频一区二区| 色综合老司机第九色激情| 欧美大尺度在线观看| 日韩高清免费观看| 久久久久99精品久久久久| 国产精品视频资源| 国产日韩换脸av一区在线观看| 国产精品av网站| 国产精选久久久久久| 亚洲欧美999| 精品一区精品二区| 91福利视频网| 久久免费国产精品1|