Okio簡析

1.廢話都不見了!!直接上代碼

比如我們做一個(gè)簡單的文件下載或拷貝操作,輸入和輸出可能是這樣的
Okio.sink(new File("***"));
Okio.sink(new FileOutputStream(new File("***")));
Okio.sink(new Socket("***",8888));
Okio.source(new File("***"));
Okio.source(new FileOutputStream(new File("***")));
Okio.source(new Socket("***",8888));

如何把它們連接起來呢溉贿?我們以下載一張網(wǎng)絡(luò)圖片為例

Okio.buffer(Okio.source("www.reibang.com/logo.png"))
.writeAll(Okio.sink("/mnt/sdcard/logo.png"))

是不是超級簡單?Okio是如何做到的呢浦旱?又有哪些優(yōu)點(diǎn)呢宇色?

2.Okio的里面的概念

Paste_Image.png

對用戶來講,Okio只有3個(gè)概念颁湖,嚴(yán)格上來講只有2個(gè)概念
1.Source只讀輸入源
2.Sink只寫輸出源
3.Buffer(混合了輸入/輸出)宣蠕,比如文件io和tcp網(wǎng)絡(luò)流
所有的操作都建立在這幾個(gè)概念之上,其實(shí)為了提高效率甥捺,在它們下面有一個(gè)叫segment的buffer機(jī)制抢蚀,我們先忽略它。接著往下看镰禾,在這些的基礎(chǔ)上能干什么呢皿曲?

3.Okio能干什么?

上面我們已經(jīng)看到了簡單的文件下載是如何實(shí)現(xiàn)的羡微,我們再看看在此基礎(chǔ)上如何實(shí)現(xiàn)一個(gè)上傳時(shí)壓縮/下載時(shí)解壓的功能
我們以上傳為例

Source zipedSrc=new GzipSource(Okio.source("/mnt/sdcard/logo.png"));
Okio.buffer(zipedSrc).writeAll(Okio.sink("www.ip.com/address"))

That's All,是不是只多了幾個(gè)詞而已呢谷饿?下載也是一樣惶我,就不寫代碼了妈倔。
以此類推,我們是不是可以用類似的方式實(shí)現(xiàn)自己的需求了嗎绸贡?然6⒑!听怕!
比如加密捧挺,我們就來個(gè)EncoderSource/EncodeSink就可了,校檢文件我們可以寫一個(gè)HashcodeSource/HashcodeSink尿瞭,上傳/下載進(jìn)度我們可以寫個(gè)ProcessSouce/PorcessSink闽烙。
(事實(shí)上,Okio里面已經(jīng)內(nèi)置了這些功能,不看的人我不告訴他,如下圖)

Paste_Image.png

4.如何實(shí)現(xiàn)一個(gè)Okio組件

為了看的容易黑竞,我們以一個(gè)代碼量最小的hash校檢為例

class HashSink implement Simk{
@Override public void write(Buffer source, long byteCount) {
long hashedCount = 0;  
for (Segment s = source.head; hashedCount < byteCount; s = s.next) {  
   int toHash = (int) Math.min(byteCount - hashedCount, s.limit - s.pos);    
//messageDigest是完成擇要功能的成員變量捕发,先不管它
  messageDigest.update(s.data, s.pos, toHash);    
  hashedCount += toHash;  
}  
 super.write(source, byteCount);}

}

就這樣了嗎?是啊很魂,就這樣扎酷,byebye

5.ByeBye

警告,以下為擇抄內(nèi)容

一它對數(shù)據(jù)進(jìn)行了分塊處理遏匆,這樣在大數(shù)據(jù)IO的時(shí)候可以以塊為單位進(jìn)行IO法挨,這可以提高IO的吞吐率。
二它對這些數(shù)據(jù)塊使用鏈表進(jìn)行管理幅聘,這可以僅通過移動(dòng)“指針”就進(jìn)行數(shù)據(jù)的管理凡纳,而不用真正去處理數(shù)據(jù),而且對擴(kuò)容來說也十分方便帝蒿。
三對閑置的塊進(jìn)行管理惫企,通過一個(gè)塊池(SegmentPool)的管理,避免系統(tǒng)GC和申請byte時(shí)的zero-fill陵叽。 其他的還有一些小細(xì)節(jié)上的優(yōu)化狞尔,比如如果你把一個(gè)UTF-8的String轉(zhuǎn)為ByteString,ByteString會保留一份對原來String的引用巩掺,這樣當(dāng)你下次 需要decode這個(gè)String時(shí)偏序,程序通過保留的引用直接返回對應(yīng)的String,從而避免了轉(zhuǎn)碼過程胖替。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末研儒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子独令,更是在濱河造成了極大的恐慌端朵,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燃箭,死亡現(xiàn)場離奇詭異冲呢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)招狸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門敬拓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人裙戏,你說我怎么就攤上這事乘凸。” “怎么了累榜?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵营勤,是天一觀的道長。 經(jīng)常有香客問我,道長葛作,這世上最難降的妖魔是什么醒第? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮进鸠,結(jié)果婚禮上稠曼,老公的妹妹穿的比我還像新娘。我一直安慰自己客年,他們只是感情好霞幅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著量瓜,像睡著了一般司恳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绍傲,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機(jī)與錄音烫饼,去河邊找鬼猎塞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛杠纵,可吹牛的內(nèi)容都是我干的荠耽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼比藻,長吁一口氣:“原來是場噩夢啊……” “哼铝量!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起银亲,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤慢叨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后务蝠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拍谐,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年请梢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赠尾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡毅弧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出当窗,到底是詐尸還是另有隱情够坐,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站元咙,受9級特大地震影響梯影,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜庶香,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一甲棍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赶掖,春花似錦感猛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至膳灶,卻和暖如春咱士,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轧钓。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工序厉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毕箍。 一個(gè)月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓脂矫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霉晕。 傳聞我的和親對象是個(gè)殘疾皇子庭再,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容