色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

okio的工作原理及使用方法

科技綠洲 ? 來源:HarmonyOS開發者 ? 作者:HarmonyOS開發者 ? 2022-06-08 09:39 ? 次閱讀

前不久,三方組件庫上新了一批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信息,將其添加到輸出流緩沖區的雙向鏈表的尾部,省去一次數據復制過程。

圖片

圖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的數據寫入輸出流緩沖區。

圖片

圖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": {

步驟二:配置倉庫鏡像地址。

npm config set @ohos:registry=https://repo.harmonyos.com/npm/

步驟三:DevEco Studio的Terminal里面輸入以下命令下載源代碼。

cd entry

步驟四:文件的頭部引入okio庫。

 import okio from '@ohos/okio';

步驟五:在config.json文件中申請存儲權限。

2. 代碼實現

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

示例1:文件寫入和讀取

圖片

本示例通過sink將內容寫入文件,通過source從文件讀取內容。代碼如下:

//通過sink將內容寫入文件

示例2:Base64解碼

圖片

本示例通過ByteString實現Base64解碼功能,代碼如下:

let byteStringObj = new okio.ByteString.ByteString(''); //生成ByteString對象

示例3:十六進制解碼

圖片

本示例通過ByteString實現十六進制解碼功能,代碼如下:

let byteStringObj = new okio.ByteString.ByteString('');

示例4:Utf8編碼

圖片

本示例通過ByteString實現Utf8編碼功能,代碼如下:

let byteStringObj = new okio.ByteString.ByteString('');

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

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

    關注

    3

    文章

    3309

    瀏覽量

    42471
  • 存儲數據
    +關注

    關注

    0

    文章

    88

    瀏覽量

    14100
  • HarmonyOS
    +關注

    關注

    79

    文章

    1973

    瀏覽量

    30143
收藏 人收藏

    評論

    相關推薦

    帶你深入探索okio組件的奧秘 提升IO效率

    字符串的編解碼轉換能力,基礎數據類型的讀寫能力以及支持對文件讀寫的能力。本期將為大家介紹okio工作原理使用方法。 ? 一、okio的產生背景 IO,即輸入輸出(Input/Out
    發表于 07-04 15:39 ?1060次閱讀

    TTL電路分析、工作原理使用方法

    今天給大家分享的是: TTL電路的分析 、TTL電路 工作原理 、TTL電路 使用方法
    發表于 05-18 09:06 ?5101次閱讀
    TTL電路分析、<b class='flag-5'>工作原理</b>、<b class='flag-5'>使用方法</b>

    頻譜分析儀的工作原理使用方法

    頻譜分析儀的工作原理使用方法
    發表于 07-16 22:04

    數碼管的工作原理使用方法

    的易用性與易學性,特別是當自己第一次動手編程點亮一個發光管時,相信對于初學者來說,一定很興奮,很有成就感吧!現在我們就趁熱打鐵,再向上跨一步,一起來學習一下數碼管的工作原理使用方法,這一期實驗將會...
    發表于 11-24 06:32

    SRAM的工作原理及其使用方法了解

    一、實驗目的:1.了解半導體靜態隨機讀寫存儲器SRAM的工作原理及其使用方法2.掌握半導體存儲器的字、位擴展技術3.用proteus設計、仿真基于AT89C51單片機的RAM擴展實驗二、實驗內容
    發表于 12-08 06:14

    為你推薦一款高效的IO組件——okio

    以及對文件讀寫的支持。本期將為大家介紹okio工作原理使用方法。 一、okio的產生背景 IO,即輸入輸出(Input/Output)。絕大多數應用都需要與外部進行數據交互,這就會
    發表于 06-10 13:11

    帶你深入探索okio組件高效的奧秘

    能力,提供字符串的編解碼轉換能力,基礎數據類型的讀寫能力以及支持對文件讀寫的能力。本期將為大家介紹okio工作原理使用方法。一、okio的產生背景IO,即輸入輸出(Input/Ou
    發表于 07-08 14:43

    電池工作原理

    電池工作原理1. 引言 2. 電池電源和使用方法
    發表于 08-20 18:05 ?5002次閱讀

    lcr數字電橋工作原理使用方法_lcr數字電橋作用介紹

    本文開始介紹了數字電橋的概念和LCR數字電橋的結構,其次介紹了lcr數字電橋工作原理和LCR數字電橋的使用方法,最后介紹了LCR數字電橋作用以及應用對象。
    的頭像 發表于 03-30 09:32 ?5.3w次閱讀
    lcr數字電橋<b class='flag-5'>工作原理</b>及<b class='flag-5'>使用方法</b>_lcr數字電橋作用介紹

    漏電保護插頭工作原理使用方法

    本文主要介紹了漏電保護插頭工作原理及漏電保護插頭使用方法
    的頭像 發表于 12-18 10:51 ?2.6w次閱讀

    膠體蓄電池工作原理_膠體蓄電池使用方法

    本文主要闡述了膠體蓄電池工作原理使用方法
    發表于 01-10 14:00 ?3366次閱讀

    數字電源工作原理 數字電源使用方法

    數字電源工作原理 數字電源使用方法 數字電源是基于數字信號處理技術實現的穩壓電源,它能夠在數字控制下精確調節輸出電壓和電流,具有精度高、穩定性強、響應速度快等優點,廣泛應用于各個領域中。 數字電源
    的頭像 發表于 10-16 16:16 ?1810次閱讀

    高壓放大器的工作原理使用方法是什么

    工作原理使用方法。 一、工作原理 放大器拓撲結構:高壓放大器通常采用共源極或共集電極的放大器拓撲結構。其中,共源極電路具有較高的輸入阻抗和較低的輸出阻抗,適合用于高壓放大器應用。通過合理設計電路結構和匹配網絡,可
    的頭像 發表于 01-02 14:59 ?582次閱讀
    高壓放大器的<b class='flag-5'>工作原理</b>和<b class='flag-5'>使用方法</b>是什么

    點焊機的工作原理使用方法

    點焊機是一種常用于金屬加工中的設備,它能夠將金屬零件通過瞬間高溫融合在一起。這種焊接方式在汽車制造、電子設備制造、金屬加工等領域廣泛應用。本文創想焊縫跟蹤小編將介紹點焊機的工作原理以及使用方法
    的頭像 發表于 03-26 17:50 ?3066次閱讀
    點焊機的<b class='flag-5'>工作原理</b>及<b class='flag-5'>使用方法</b>

    BLDC電機的工作原理使用方法

    自動化系統,BLDC電機的身影無處不在。本文將詳細探討BLDC電機的工作原理使用方法及其優勢,以期為讀者提供全面且深入的了解。
    的頭像 發表于 06-04 18:26 ?1129次閱讀
    主站蜘蛛池模板: 国产特级毛片AAAAAAA高清| 草莓视频免费看| 4388成人| jj插入bb| 国产传媒在线播放| 国产亚洲精品成人a在线| 久久xxxx| 欧美 亚洲 日韩 在线综合| 日本亚洲欧洲免费旡码| 小莹的性荡生活| 在线视频免费观看| 99视频福利| 高h肉肉乳共妻| 黄梅戏mp3大全| 美女露出逼| 色悠久久久久综合欧美99| 性色少妇AV蜜臀人妻无码| 在线成年av动漫电影| 67194线在线精品观看| 国产www视频| 久久www成人看片| 欧美视频 亚洲视频| 无码观看AAAAAAAA片| 中文字幕国产视频| 出租屋自拍贵在真实15P| 精品国内自产拍在线观看视频| 暖暖日本免费播放| 无码丰满人妻熟妇区| 主播蜜汁丝袜精品自拍| 单亲妈妈3韩国电影免费观看| 国际老妇高清在线观看| 蜜芽无码亚洲资源网站| 无人区在线日本高清免费 | 日韩欧美三区| 亚洲色t图| 超碰在线公开视频| 久草在线在线精品观看| 日本一二三区视频在线| 伊人久久综合热青草| 国产精品99re6热在线播放| 美女黄图大全|