在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一個可應用于HarmonyOS的高效IO庫

HarmonyOS開發者 ? 來源:HarmonyOS開發者 ? 作者:HarmonyOS開發者 ? 2022-06-08 09:22 ? 次閱讀
前不久,三方組件庫上新了一批JS/eTS組件,其中就包括okio組件。okio是一個可應用于HarmonyOS的高效IO庫,它依托于系統能力,提供字符串的編解碼轉換能力,基礎數據類型的讀寫能力以及對文件讀寫的支持。本期將為大家介紹okio的工作原理及使用方法。

一、okio的產生背景

IO,即輸入輸出(Input/Output)。絕大多數應用都需要與外部進行數據交互,這就會涉及IO。系統提供了IO能力,在使用系統IO時,通常需要一個中間緩沖區來保存讀取到的數據。數據先從輸入流緩沖區復制到中間緩沖區,再從中間緩沖區復制到輸出流緩沖區。中間多次拷貝,降低了IO效率,同時增加了系統消耗。為了滿足開發者對IO的更高要求,三方組件庫推出IO處理利器——okio(JS版本)。okio使用Segment作為數據存儲容器,通過提供Segment移動、共享、合并和分割的能力,讓數據讀寫變得非常靈活,也減少了數據復制,提升了IO效率。此外,okio還通過SegmentPool對Segment進行回收和復用,減少大量創建Segment帶來的系統消耗。下面就帶大家深入了解JS版本的okio的工作原理,探索它是如何提升IO效率的~

二、兩個基本概念

在深入解析okio的工作原理之前,我們先來了解兩個基本概念:Segment和SegmentPool。

1. Segment

okio將數據分割成一塊塊的片段存放在Segment里面。Segment是一個數據存儲的真正類,內部維護著一個大小為8192字節的字節數組用于存儲數據。Segment最小可共享、可寫入的數據大小為1024字節。Segment使用pos、limit、shared、owner、prev、next來分別記錄讀寫位置、是否可寫入、是否能共享、數據擁有者、前置節點和后置節點信息。Segment對外提供sharedCopy、unsharedCopy、split、push、pop、compact、writeTo等接口用于操作數據。

Segment同時擁有前置節點和后置節點,構成一個雙向鏈表。讀取數據的時候,從雙向鏈表的頭部開始讀取;而寫入數據的時候,從雙向鏈表的尾部寫入數據。

2. SegmentPool為了管理Segment,okio維護了一個Segment對象池(即SegmentPool),對廢棄的Segment回收、復用和內存共享,從而減少內存的申請和GC(garbage collection,垃圾收集)的頻率,使性能得到優化。SegmentPool是一個由最多8個Segment組成的單鏈表。一個Segment的最大大小是8192字節(即8KB),所以SegmentPool的最大大小是64KB。

三、okio的工作原理

okio組件最重要的功能就是“讀”和“寫”。下面我們就從讀寫開始,了解okio的工作原理。

1. 讀寫數據okio讀寫數據的過程中,遵循大塊數據移動、小塊數據復制的原則。okio從輸入流讀取數據到輸入流緩沖區時,會先找到雙向鏈表尾部的Segment節點,如果此節點的剩余容量足夠,則直接將讀取到的數據存入到此節點。如果此節點的剩余容量不足,則從SegmentPool里面取一個Segment鏈接到雙向鏈表的尾部,然后將數據存入這個新節點。okio從輸入流緩沖區讀取數據,再寫入數據到輸出流緩沖區。這個過程比較復雜,有以下幾種情況:

(1) 從輸入流緩沖區獲取到Segment,如果數據是滿的(字節數組data長度為8092字節),那么直接修改此Segment的prev和next信息,將其添加到輸出流緩沖區的雙向鏈表的尾部,省去一次數據復制過程。

bc533964-e6c8-11ec-ba43-dac502259ad0.png

圖1大塊數據移動 (2) 從輸入流緩沖區獲取到Segment(假設為Segment1),如果數據不是滿的,可以通過pos和limit信息來確定segment1的可讀數據,再和輸出流緩沖區的雙向鏈表的尾部節點(假設為Segment2)的剩余容量進行對比: 如果Segment1的可讀數據比Segment2的剩余容量小,則把Segment1的數據復制到Segment2,然后回收Segment1到SegmentPool。 如果Segment1的可讀數據比Segment2的剩余容量大,那么直接修改Segment1的prev和next信息,將其添加到Segment2的后面。

(3) 從輸入流緩沖區獲取到Segment(假設為Segment3),如果只需要傳遞部分數據(比如總數據為4096字節,只傳遞1024字節),okio會通過split接口將Segment3拆分成含3072字節數據的Segment3-1和含1024字節數據的Segment3-2,然后按照(2)的邏輯將Segment3-2的數據寫入輸出流緩沖區。

bc708a3c-e6c8-11ec-ba43-dac502259ad0.png

圖2 Segment拆分

拆分Segment的時候,可以通過參數指定拆分后的第一個Segment含有的未讀字節數(byteCount)。拆分后,第一個Segment包含的數據范圍是[pos,pos+byteCount),第二個Segment包含的數據范圍是[pos+byteCount,limit)。拆分Segment時也遵循大塊數據移動、小塊數據復制的原則。當byteCount大于1024時,使用共享的Segment,否則復制數據。(注:文件、流、socket相關的IO優化需要系統支持,待后續版本優化提供。)2. Segment的回收與復用接下來,我們再來看看SegmentPool是如何回收和復用Segment的。

每次okio想要使用Segment就從SegmentPool中獲取,使用完畢后又會放回到SegmentPool中等待復用,核心方法為take()和recycle()。

(1) take()方法

take()方法負責從對象池單鏈表的頭部獲取可以使用的Segment。如果獲取不到,說明單鏈表是空的,此時新創建一個Segment給緩沖區使用。如果能獲取到,則取出單鏈表的頭部節點,再將下一個節點置為單鏈表的頭部節點,并將取出來的Segment的next置空,同時更新對象池大小。

(2) recycle()方法recycle()方法負責回收緩沖區里面使用完畢的Segment。回收開始時,首先更新對象池大小,然后把回收對象Segment添加到單鏈表頭部,接著重置Segment的pos和limit為0。注意,以下情況不會回收Segment:
  • 當前Segment的prev和next不為空

  • 當前Segment是共享的

  • 對象池已經有8個Segment了

3. 字符串處理除了Segment和SegmentPool外,okio還封裝了ByteString類來進行字符串處理。ByteString提供Base64編解碼、utf-8編碼、十六進制編解碼、大小寫轉換、內容比較等豐富的API,可以很方便地處理字符串。在進行字符串處理時,由于ByteString同時持有原始字符串和對應的字節數組,可以直接使用字節數組里面的數據進行操作,不需要先將字符串轉換為字節數組。特別是在頻繁轉換編碼的場景下,通過這種以空間換時間的方式,可以避免字符串與字節數組的多次轉換,減少了時間和系統性能消耗。

四、okio的使用及示例

1. 前置配置步驟一:在entry 的package.json文件中添加以下依賴項。
"dependencies": {    "okio": "^1.0.0"  }
步驟二:配置倉庫鏡像地址。
npm config set @ohos:registry=https://repo.harmonyos.com/npm/
步驟三:DevEco Studio的Terminal里面輸入以下命令下載源代碼。
cd entrynpm install @ohos/okio

步驟四:文件的頭部引入okio庫。
 import okio from '@ohos/okio';
步驟五:在config.json文件中申請存儲權限。
   "reqPermissions": [      {        "name": "ohos.permission.WRITE_USER_STORAGE", //寫入用戶存儲的權限        "reason": "Storage",        "usedScene": {          "when": "always",          "ability": [            "com.example.okioapplication.MainAbility"          ]        }      },      {        "name": "ohos.permission.READ_USER_STORAGE", //讀取用戶存儲的權限        "reason": "Storage",        "usedScene": {          "when": "always",          "ability": [            "com.example.okioapplication.MainAbility"          ]        }      },      {        "name": "ohos.permission.WRITE_EXTERNAL_MEDIA_MEMORY", //寫入外部存儲的權限        "reason": "Storage",        "usedScene": {          "when": "always",          "ability": [            "com.example.okioapplication.MainAbility"          ]        }      }    ]    }

2. 代碼實現執行完上面的配置操作后,就可以進入代碼編寫階段了。開發者可以使用okio提供的豐富的API接口來實現功能。下面為大家展示四個實現示例,供大家參考學習。

示例1:文件寫入和讀取

bc977156-e6c8-11ec-ba43-dac502259ad0.gif

本示例通過sink將內容寫入文件,通過source從文件讀取內容。代碼如下:
//通過sink將內容寫入文件var sink = new okio.Sink(this.fileUri);sink.write(this.Value,false); //通過source從文件讀取內容var source = new okio.Source(this.fileUri);source.read().then(function (data) { context.readValue = data;    }).catch(function (error) {console.log("error=>"+error);    });

示例2:Base64解碼

bce3cdb2-e6c8-11ec-ba43-dac502259ad0.gif

本示例通過ByteString實現Base64解碼功能,代碼如下:
let byteStringObj = new okio.ByteString.ByteString(''); //生成ByteString對象let decodeBase64 = byteStringObj.decodeBase64('SGVsbG8gd29ybGQ='); //解碼Base64字符串this.decodeBase64Value = JSON.stringify(decodeBase64); //顯示解碼結果
示例3:十六進制解碼

bd4c4dce-e6c8-11ec-ba43-dac502259ad0.gif

本示例通過ByteString實現十六進制解碼功能,代碼如下:
let byteStringObj = new okio.ByteString.ByteString('');let decodehex = byteStringObj.decodeHex('48656C6C6F20776F726C640D0A');this.decodeHexValue = JSON.stringify(decodehex);
示例4:Utf8編碼

bd746d04-e6c8-11ec-ba43-dac502259ad0.gif

本示例通過ByteString實現Utf8編碼功能,代碼如下:
let byteStringObj = new okio.ByteString.ByteString('');let encodeUtf8 = byteStringObj.encodeUtf8('Hello world #4  ( ????? ??)');this.encodeUtf8Value = JSON.stringify(encodeUtf8);

本期okio組件就為大家介紹到這里了。okio組件已開源,歡迎大家參與貢獻。

開源地址如下:

https://gitee.com/openharmony-tpc/okio還想了解更多優秀的組件?歡迎點擊下方的“閱讀原文”,跳轉到三方組件庫,更多優秀組件等你來發現!

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 組件
    +關注

    關注

    1

    文章

    530

    瀏覽量

    18328
  • HarmonyOS
    +關注

    關注

    80

    文章

    2084

    瀏覽量

    32248

原文標題:為你推薦一款高效的IO組件——okio

文章出處:【微信號:HarmonyOS_Dev,微信公眾號:HarmonyOS開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    HarmonyOS5云服務技術分享--云數據使用指南

    ??: 敏感數據啟用字段級加密(如用戶手機號)。 ? ??總結?? 華為云數據(CloudDB)讓HarmonyOS應用的數據管理變得輕松又高效!通過本文的代碼示例和技巧,相信你已經掌握了增刪改查
    發表于 05-22 18:29

    Profinet 協議遠程 IO 模塊:端子機高效運行的關鍵助手

    在電線加工領域,端子機的高效穩定運行至關重要。如今,項先進的技術 ——Profinet 協議遠程 IO 模塊,正悄然改變著端子機的控制模式,為其高效工作注入強大動力。?
    的頭像 發表于 03-21 17:36 ?271次閱讀
    Profinet 協議遠程 <b class='flag-5'>IO</b> 模塊:端子機<b class='flag-5'>高效</b>運行的關鍵助手

    分布式 IO 模塊:水力發電設備高效控制的關鍵

    在能源領域不斷追求高效與可持續發展的今天,水力發電作為種清潔、可再生的能源形式,備受關注。而要實現水力發電設備的高效運行,精準的控制技術至關重要。分布式 IO 模塊,正悄然成為水力發
    的頭像 發表于 02-20 15:49 ?348次閱讀
    分布式 <b class='flag-5'>IO</b> 模塊:水力發電設備<b class='flag-5'>高效</b>控制的關鍵

    迅為瑞芯微RK3562開發板/核心板介紹可應用于人臉跟蹤、視頻監控、自動語音識別(ASR)等

    可應用于人臉跟蹤、身體跟蹤、視頻監控、自動語音識別(ASR)、圖像分類駕駛員輔助系統(ADAS)、車牌識別、物體識別等。 iTOP-3562開發板/核心板采用瑞芯微RK3562處理器,內部集成了四核
    發表于 02-18 14:46

    HarmonyOS 應用開發賦能套件:鴻蒙原生應用開發的 “神助攻”

    隨著鴻蒙生態的快速發展,越來越多的開發者投身于鴻蒙原生應用的開發中。然而,在學習鴻蒙原生應用開發時,許多開發者仍面臨系列問題,如不清楚如何快速入門,如何系統地學習并掌握開發技能,如何高效獲取樣例
    發表于 02-17 16:37

    分布式 IO:礦山砂石裝備高效控制的新引擎

    在砂石與礦山行業這片充滿挑戰與機遇的領域,裝備的高效運行和精準控制直是企業追求的核心目標。隨著科技的飛速發展,明達技術推出的MR30分布式 IO 模塊作為種先進的控制技術,正逐漸嶄
    的頭像 發表于 02-12 17:08 ?297次閱讀

    Profinet IO通信故障原因及解決辦法

    Profinet IO(Industrial Ethernet for Automation)作為種高性能的工業以太網通信協議,廣泛應用于工業自動化領域。然而,在實際應用中,Profinet
    的頭像 發表于 02-03 14:50 ?1347次閱讀

    AKI跨語言調用神助攻C/C++代碼遷移至HarmonyOS NEXT

    本帖最后由 HarmonyOS開發者社區 于 2025-1-3 15:41 編輯 隨著HarmonyOS NEXT的發布,越來越多的應用加速推進鴻蒙化。在這過程中,如何高效遷移
    發表于 01-02 17:08

    MR20體式IO模塊助力折彎機高效控制

    在工業生產中,折彎機作為鈑金加工的重要設備,其控制系統的性能直接影響生產效率和產品質量。今天,我們就來了解下如何通過明達技術MR20體式IO模塊實現折彎機的高效控制,為企業創造更多
    的頭像 發表于 12-12 14:25 ?431次閱讀
    MR20<b class='flag-5'>一</b>體式<b class='flag-5'>IO</b>模塊助力折彎機<b class='flag-5'>高效</b>控制

    HarmonyOS開發寶典震撼來襲,卓越應用開發之旅觸即發,輕松啟程!

    HarmonyOS賦能產品,全面護航開發者從HarmonyOS感知、學習進階、開發實踐至技術支持的全旅程,助力開發者高效開發! 我們傾心打造了
    發表于 12-05 08:57

    λ-IO:存儲計算下的IO棧設計

    動機和背景? ? 存儲計算存儲資源的充分利用。IO棧是管理存儲器的的基本組件,包括設備驅動、塊接口層、文件系統,目前些用戶空間IO(如SPDK)有效降低了延遲,但是
    的頭像 發表于 12-02 10:35 ?578次閱讀
    λ-<b class='flag-5'>IO</b>:存儲計算下的<b class='flag-5'>IO</b>棧設計

    AWTK 最新動態:支持鴻蒙系統(HarmonyOS Next)

    為ToolkitAnyWhere,是ZLG傾心打造的套基于C語言開發的GUI框架。旨在為用戶提供功能強大、高效可靠、簡單易用、可輕松做出炫酷效果的GUI引擎,支
    的頭像 發表于 11-06 08:03 ?749次閱讀
    AWTK 最新動態:支持鴻蒙系統(<b class='flag-5'>HarmonyOS</b> Next)

    io口和串口的區別 單片機有多少io

    等。而串口,即串行通信接口(Serial Communication Interface),是種數據通信方式,通過條數據線按照順序傳送數據。IO口和串口在功能和用途上存在顯著區別: 通信方式 :
    的頭像 發表于 10-06 10:06 ?3829次閱讀

    FS2957X可應用于電動自行車快速充電轉換頭方案

    FS2957X可應用于電動自行車快速充電轉換頭方案,詳情可查閱FS2957X+協議芯片可實現電動車給手機快充。原廠提供DEMO測試,方案開發及技術支持! FS2957X是款120V寬電壓降壓DC-DC電源芯片,外置NMOS+1肖特基、外圍相當精簡、采用 ESOP-
    的頭像 發表于 09-10 18:28 ?554次閱讀
    FS2957X<b class='flag-5'>可應用于</b>電動自行車快速充電轉換頭方案

    為什么用于接收的IO口無法觸發中斷?

    我的代碼邏輯大概是“串口收到數據后控制IO口發出高低電平,用另外IO口接收這個高低電平”
    發表于 06-25 08:14
    主站蜘蛛池模板: 亚洲欧洲第一页 | www.看片| 又粗又大又爽又色又过瘾视频 | 六月丁香色婷婷 | 国产资源网站 | 欧美日穴 | 日本免费人成黄页在线观看视频 | 男人天堂网www | 天天色色色 | 一个人看的www片免费高清视频 | 男女交性无遮挡免费视频 | 久久97精品久久久久久久看片 | 免费aa| 亚洲一级毛片在线观播放 | 欧美人成a视频www | 午夜影院在线看 | 奇米影视大全 | 曰韩一级| www国产永久免费视频看看 | 国产一级一片免费播放视频 | 亚洲天堂婷婷 | 亚洲日本黄色 | 日本xxxxxx69| 欧美三级第一页 | 婷婷激情狠狠综合五月 | 四虎新网址| 天天干 夜夜操 | 一区二区三区四区在线免费观看 | 亚洲色妞 | 欧美日韩精品一区二区另类 | 一区二区在线看 | 717影院理论午夜伦不卡久久 | 一级一黄在线观看视频免费 | 免费亚洲成人 | 天堂激情 | 啪啪免费小视频 | 国产哺乳期奶水avav | 欧美日韩一日韩一线不卡 | 天堂影院在线 | 黄a毛片 | 天堂成人 |