當前位置:
首頁 > 最新 > JSON行解析器和使用objectMode配置的流用法

JSON行解析器和使用objectMode配置的流用法

可讀流被用來為I/O源提供靈活的API,也可以被用作解析器。想要使用流API提供的高級介面封裝I/O源。通過繼承stream.Readable類實現一個可讀流,同時創建一個_read(size)方法。當圍繞一個所需要的底層數據而實現一個自定義stream.Readable類是有用的。例如,我正在開發一個項目,客戶端發送了JSON文件,包含數百萬行的數據。我決定寫一個簡單的stream.Readable類來讀取一個緩衝區,當一個新行出現,使用JSON.parse解析記錄。使用stream.Readable解析有換行符的記錄如下展示。

通常要確保調用父類的構造函數;當數據源準備好可以觸發之後的reads事件時調用read();從stream.Readable繼承來創建一個可定製的新類;所有的定製stream.Readable類都必須實現_read()方法;當類準備好接收更多數據時,在源上調用read();從buffer的開始截取第一行來獲取一些文本進行解析;無論何時當一個JSON記錄解析出來時,觸發一個「object」事件,對這個類來說是唯一的,但不是必須的;把解析好的JSON發送回內部隊列;創建一個JSONLineReader的實例,傳遞一個文件流給它處理。

使用了一個構造器函數,JSONLineReader,繼承自stream.Readable,來讀取一個多行的JSON文件。JSONLineReader的源數據也是一個可讀流,因此也綁定了一個可讀事件,因此JSONLineReader知道何時開始解析。_read方法檢查緩衝區是否為空,如果是,從源讀取更多數據添加到內部的緩衝區。然後當前行的索引遞增,並且如果到達行尾,首行就從buffer中分割。一旦到達一個整行,解析器觸發對象事件——類的用戶能夠綁定此事件接收每一行JSON數據。當這個例子運行,一個文件的數據會通過這個類的實例。在內部,數據將被排隊。當source.read被執行,最後的數據塊將會被返回,因此JSONLineReader已經準備好的時候能夠處理它。一旦足夠的數據被讀取或到達一個新行,然後結果會調用this.push收集起來。一旦this.push被調用,stream.Readable將會把排隊的結果轉發給一個消費流。這使得該流可以進一步通過管道進行可寫流處理。在這個例子中JSON對象通過一個自定義事件觸發。本例中的最後幾行附加的事件偵聽器監聽處理結果。

Readable.prototype._read的大小參數是advisory。這意味著底層的實現可以用它來知道有多少數據獲取,這讓你可以不實現並不必要的。在我們解析了整行,但一些數據格式可以以塊的形式處理,在這種情況下,大小參數是很重要的。在這個例子的原代碼的基礎上,我使用結果JSON對象來填充資料庫。該數據也被重定向和gzip壓縮到另一個文件。這種流容易編寫,易於閱讀。使用了字元串,但對於對象的例子呢?最多的流直接處理I/O——文件、網路協議等,將使用原始位元組或字元串流。但有時創建JavaScript對象流是有用的。

下面顯示了如何安全地從stream.Readable繼承,以及傳遞對象作為參數來設置一個流,並且作為JavaScript對象來進行處理。

這個流應該都是使用objectMode,所以在這裡設置,並且把剩餘的設置參數傳遞給stream.Readable構造函數;調用Node內置的process.memoryUsage()方法來創建一個對象;給可讀流添加一個監聽器來跟蹤什麼時候流準備好可以輸出數據,然後調用stream.read()來獲取最新的數據。 在上面的例子中,MemoryStream示例使用數據對象,所以objectMode傳遞給可讀構造作為一個選項。然後process.memoryUsage被用來產生一些合適的數據。當這個類的實例發出可讀,表示它已經準備好接收,之後內存使用情況的數據將被記錄到控制台讀取。當使用objectMode時,流的底層行為發生改變,用來除去內部緩衝區合并和長度檢查,並且讀取和寫入時忽略大小參數。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 行家匯 的精彩文章:

在Node中使用RabbitMQ和Redis
Node使用對象組織管理事件名稱
Node如何創建一個基於EventEmitter的自定義類
Node的創建和管理模塊
Node使用流和目錄運行流程的介紹

TAG:行家匯 |

您可能感興趣

SpringBoot使用Nacos配置中心
Tomcat常用配置,跟亂碼Say Goodbye
VSCode配置Python編輯器
Cisco路由器Easy VPN的配置
SpringBoot中如何進行Bean配置
Android 使用gradle打包的各種配置
dotnet core 使用Apollo配置中心
如何在微服務或Tomcat中配置使用Listener
hue配置使用mysql
eclipse使用ant + ivy 配置項目jar包和依賴關係
MyBatis 配置 typeHandlers 詳解
Redis 配置
Facebook為何放棄ZooKeeper轉用自研配置管理系統?
springmvc里使用註解進行攔截器配置
Eclipse Debug 配置
Servlet+MyBatis項目轉Spring Cloud微服務,多數據配置修改建議
新MacBook Pro配置升級:頂配要用Intel i9
SpringBoot配置基礎攔截器
Spring Config 高可用配置中心
ELK 架構之 Logstash和Filebeat 安裝配置