91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一個可應(yīng)用于HarmonyOS的高效IO庫

HarmonyOS開發(fā)者 ? 來源:HarmonyOS開發(fā)者 ? 作者:HarmonyOS開發(fā)者 ? 2022-06-08 09:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前不久,三方組件庫上新了一批JS/eTS組件,其中就包括okio組件。okio是一個可應(yīng)用于HarmonyOS的高效IO庫,它依托于系統(tǒng)能力,提供字符串的編解碼轉(zhuǎn)換能力,基礎(chǔ)數(shù)據(jù)類型的讀寫能力以及對文件讀寫的支持。本期將為大家介紹okio的工作原理及使用方法。

一、okio的產(chǎn)生背景

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

二、兩個基本概念

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

1. Segment

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

Segment同時擁有前置節(jié)點(diǎn)和后置節(jié)點(diǎn),構(gòu)成一個雙向鏈表。讀取數(shù)據(jù)的時候,從雙向鏈表的頭部開始讀??;而寫入數(shù)據(jù)的時候,從雙向鏈表的尾部寫入數(shù)據(jù)。

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

三、okio的工作原理

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

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

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

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

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

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

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

圖2 Segment拆分

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

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

(1) take()方法

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

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

  • 當(dāng)前Segment是共享的

  • 對象池已經(jīng)有8個Segment了

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

四、okio的使用及示例

1. 前置配置步驟一:在entry 的package.json文件中添加以下依賴項(xiàng)。
"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文件中申請存儲權(quán)限。
   "reqPermissions": [      {        "name": "ohos.permission.WRITE_USER_STORAGE", //寫入用戶存儲的權(quán)限        "reason": "Storage",        "usedScene": {          "when": "always",          "ability": [            "com.example.okioapplication.MainAbility"          ]        }      },      {        "name": "ohos.permission.READ_USER_STORAGE", //讀取用戶存儲的權(quán)限        "reason": "Storage",        "usedScene": {          "when": "always",          "ability": [            "com.example.okioapplication.MainAbility"          ]        }      },      {        "name": "ohos.permission.WRITE_EXTERNAL_MEDIA_MEMORY", //寫入外部存儲的權(quán)限        "reason": "Storage",        "usedScene": {          "when": "always",          "ability": [            "com.example.okioapplication.MainAbility"          ]        }      }    ]    }

2. 代碼實(shí)現(xiàn)執(zhí)行完上面的配置操作后,就可以進(jìn)入代碼編寫階段了。開發(fā)者可以使用okio提供的豐富的API接口來實(shí)現(xiàn)功能。下面為大家展示四個實(shí)現(xiàn)示例,供大家參考學(xué)習(xí)。

示例1:文件寫入和讀取

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

本示例通過sink將內(nèi)容寫入文件,通過source從文件讀取內(nèi)容。代碼如下:
//通過sink將內(nèi)容寫入文件var sink = new okio.Sink(this.fileUri);sink.write(this.Value,false); //通過source從文件讀取內(nèi)容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實(shí)現(xiàn)Base64解碼功能,代碼如下:
let byteStringObj = new okio.ByteString.ByteString(''); //生成ByteString對象let decodeBase64 = byteStringObj.decodeBase64('SGVsbG8gd29ybGQ='); //解碼Base64字符串this.decodeBase64Value = JSON.stringify(decodeBase64); //顯示解碼結(jié)果
示例3:十六進(jìn)制解碼

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

本示例通過ByteString實(shí)現(xiàn)十六進(jìn)制解碼功能,代碼如下:
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實(shí)現(xiàn)Utf8編碼功能,代碼如下:
let byteStringObj = new okio.ByteString.ByteString('');let encodeUtf8 = byteStringObj.encodeUtf8('Hello world #4  ( ????? ??)');this.encodeUtf8Value = JSON.stringify(encodeUtf8);

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

開源地址如下:

https://gitee.com/openharmony-tpc/okio還想了解更多優(yōu)秀的組件?歡迎點(diǎn)擊下方的“閱讀原文”,跳轉(zhuǎn)到三方組件庫,更多優(yōu)秀組件等你來發(fā)現(xiàn)!

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 組件
    +關(guān)注

    關(guān)注

    1

    文章

    575

    瀏覽量

    19028
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2154

    瀏覽量

    36086

原文標(biāo)題:為你推薦一款高效的IO組件——okio

文章出處:【微信號:HarmonyOS_Dev,微信公眾號:HarmonyOS開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    三格電子體式io和分體式io的區(qū)別#

    IO
    jf_68793483
    發(fā)布于 :2026年02月27日 14:15:48

    菲諾克科技推出沁恒CH9347有線透傳芯片應(yīng)用于移動電源新國標(biāo)方案

    菲諾克科技推出沁恒CH9347有線透傳芯片應(yīng)用于移動電源新國標(biāo)方案 菲諾克科技根據(jù)新國標(biāo)移動電源與各類終端便捷通信的核心需求,采用沁恒USB透傳芯片CH9347推出了充電寶USB通信、低功耗藍(lán)牙
    發(fā)表于 02-10 09:10

    恒訊科技解析:如何安裝MySQL并創(chuàng)建數(shù)據(jù)

    管理系統(tǒng)(RDBMS),使用結(jié)構(gòu)化查詢語言(SQL)高效地組織和管理數(shù)據(jù)。它是全球最受歡迎的開源數(shù)據(jù)系統(tǒng)之,廣泛應(yīng)用于網(wǎng)頁開發(fā)、電子商務(wù)和商業(yè)應(yīng)用。 常見用例? MySQL 是多種
    的頭像 發(fā)表于 01-14 14:25 ?185次閱讀

    釘釘正式開源HarmonyOS圖片編輯組件

    近日,由釘釘團(tuán)隊(duì)自主研發(fā)的“HarmonyOS圖片編輯組件”正式上線OpenHarmony三方中心倉并開源。作為款填補(bǔ)鴻蒙社區(qū)圖像處理領(lǐng)域空白的重量級組件,該方案基于HarmonyOS
    的頭像 發(fā)表于 01-05 09:58 ?518次閱讀

    圣邦微電子發(fā)布高效率LED驅(qū)動芯片SGM37601

    圣邦微電子推出SGM37601,款六通道40V高效率LED驅(qū)動芯片。該器件可應(yīng)用于平板電腦和筆記本電腦等中尺寸LCD顯示屏設(shè)備。
    的頭像 發(fā)表于 12-12 17:20 ?3118次閱讀
    圣邦微電子發(fā)布<b class='flag-5'>高效</b>率LED驅(qū)動芯片SGM37601

    超實(shí)用!頁搞定威綸通IO顯示

    IO監(jiān)控畫面是自動化設(shè)備中用于快速診斷故障的常用功能。然而,當(dāng)設(shè)備IO點(diǎn)數(shù)量眾多時,往往需要配置多個監(jiān)控畫面,這過程不僅繁瑣易錯,也降低了排查效率。 那么,能否在
    的頭像 發(fā)表于 11-12 15:42 ?748次閱讀
    超實(shí)用!<b class='flag-5'>一</b>頁搞定威綸通<b class='flag-5'>IO</b>顯示

    GraniStudio:IO寫入例程

    說明 實(shí)現(xiàn)輸出IO控制以及讀取。 2.1通過初始化IO算子連接格拉尼控制器IO塊,導(dǎo)入工程自動進(jìn)行連接。 2.2 通過IO配置算子輸出配置的IO
    的頭像 發(fā)表于 08-22 16:47 ?774次閱讀
    GraniStudio:<b class='flag-5'>IO</b>寫入例程

    Aisler 發(fā)布 Lovely Library:為 KiCad 打造的高質(zhì)量歐洲元器件

    “ ?看到 Aisler 的推文,覺得挺搞笑的,原來元器件也可以有地域之分;?不過對用戶來說,更多的高質(zhì)量器件定會讓設(shè)計(jì)更高效。好東西還是要分享!? ” ? 以上的內(nèi)容翻譯如下:
    的頭像 發(fā)表于 08-04 11:13 ?909次閱讀
    Aisler 發(fā)布 Lovely Library:<b class='flag-5'>一</b><b class='flag-5'>個</b>為 KiCad 打造的高質(zhì)量歐洲元器件<b class='flag-5'>庫</b>

    模塊通吃DI/DO/AI/AO!無線IO的萬能信號采集方案

    無線IO通訊模塊是種特殊的輸入輸出(I/O)設(shè)備,它采用無線通訊技術(shù)實(shí)現(xiàn)I/O信號的傳輸。以下是對無線IO通訊模塊的詳細(xì)介紹: 、定義與功能 定義:無線
    的頭像 發(fā)表于 07-22 10:15 ?624次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個</b>模塊通吃DI/DO/AI/AO!無線<b class='flag-5'>IO</b>的萬能信號采集方案

    文詳解Advanced IO wizard異步模式

    7nm Versal系列相對于16nm Ultrascale plus系列,IO做了升級,U+系列的HPIO在Versal升級為XPIO。Versal系列每一個XPIO bank包含54IO
    的頭像 發(fā)表于 07-11 09:52 ?1590次閱讀
    <b class='flag-5'>一</b>文詳解Advanced <b class='flag-5'>IO</b> wizard異步模式

    HarmonyOS入門指南

    上手的HarmonyOS工具,借助眾多實(shí)用工具類,致力于助力開發(fā)者迅速構(gòu)建鴻蒙應(yīng)用。 2、開源框架 harmony-utils 款功能豐富且極易上手的HarmonyOS工具
    的頭像 發(fā)表于 06-27 00:11 ?804次閱讀

    HarmonyOS實(shí)戰(zhàn):3秒實(shí)現(xiàn)自定義輪播圖

    那么簡單,需要考慮的細(xì)節(jié)很多。不過在 HarmonyOS 中實(shí)現(xiàn)輪播圖卻是十分的簡單,本篇文章教你在最短的時間內(nèi)快速實(shí)現(xiàn)自定義的 輪
    的頭像 發(fā)表于 06-24 17:06 ?1521次閱讀

    HarmonyOS5云服務(wù)技術(shù)分享--云數(shù)據(jù)使用指南

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

    體式 IO 模塊:線纜設(shè)備車間高效控制的新引擎

    在當(dāng)今競爭激烈的制造業(yè)環(huán)境中,線纜設(shè)備車間面臨著提高生產(chǎn)效率、降低成本和提升產(chǎn)品質(zhì)量的多重挑戰(zhàn)。實(shí)現(xiàn)高效的自動化控制成為了車間突破發(fā)展瓶頸的關(guān)鍵,而明達(dá)技術(shù)MR20體式 IO 模塊的出現(xiàn),為線纜設(shè)備車間帶來了全新的解決方案。
    的頭像 發(fā)表于 03-25 11:15 ?658次閱讀
    <b class='flag-5'>一</b>體式 <b class='flag-5'>IO</b> 模塊:線纜設(shè)備車間<b class='flag-5'>高效</b>控制的新引擎

    Profinet 協(xié)議遠(yuǎn)程 IO 模塊:端子機(jī)高效運(yùn)行的關(guān)鍵助手

    在電線加工領(lǐng)域,端子機(jī)的高效穩(wěn)定運(yùn)行至關(guān)重要。如今,項(xiàng)先進(jìn)的技術(shù) ——Profinet 協(xié)議遠(yuǎn)程 IO 模塊,正悄然改變著端子機(jī)的控制模式,為其高效工作注入強(qiáng)大動力。?
    的頭像 發(fā)表于 03-21 17:36 ?800次閱讀
    Profinet 協(xié)議遠(yuǎn)程 <b class='flag-5'>IO</b> 模塊:端子機(jī)<b class='flag-5'>高效</b>運(yùn)行的關(guān)鍵助手