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的里面的概念
對用戶來講,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)置了這些功能,不看的人我不告訴他,如下圖)
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)碼過程胖替。