Android IO簡化之Okio庫
概要
? 如果之前有使用過Okhttp瞎领,那么你一定知道底層的IO讀取是由square公司開發(fā)的Okio庫导饲。它補(bǔ)充了Java.io和java.nio的不足姐扮,以便能夠更加方便,快速的訪問炊甲、存儲和處理你的數(shù)據(jù)亮瓷。而在一般的開發(fā)中,我們也可以使用Okio來做IO讀寫晰甚,非常方便深得我心衙传。
核心概念
? 在日常的開發(fā)過程中,Okio的使用非常方便厕九,在于相比java.io庫它簡化了很多繁雜而且我們平時(shí)又使用不到的東西蓖捶。這其中最核心的兩個(gè)類便是 Sink, Source。Source可以簡單的理解為InputStream 而Sink則對應(yīng)為OutPutStream止剖。這兩個(gè)接口都繼承Closeable接口腺阳,所以在使用結(jié)束我們可以當(dāng)做正常的IO關(guān)閉。
-
Sink
它有一子類接口 BufferedSink穿香,BufferedSink的實(shí)現(xiàn)類為RealBufferedSink亭引。BufferedSink中定義了一系列寫入緩存區(qū)的方法,比如write方法寫byte數(shù)組皮获,writeUtf8寫字符串焙蚓,還有一些列的writeByte,writeString洒宝,writeShort购公,writeInt,writeLong雁歌,writeDecimalLong等等方法宏浩;
-
Source
它有一子類接口 BufferedSource。 BufferedSource的實(shí)現(xiàn)類為RealBufferedSource靠瞎,BufferedSource中定義了一系列讀取方法比庄,對應(yīng)上面的寫入方法read方法寫byte數(shù)組,readUtf8寫字符串乏盐。
兩個(gè)支持緩沖區(qū)的接口的實(shí)現(xiàn)類RealBufferedSink和RealBufferedSource都是通過包裝一個(gè)Sink+Buffer或者Source+Buffer來進(jìn)行實(shí)現(xiàn)的佳窑。
說了這么多,直接上代碼吧父能。所有的IO操作神凑,核心代碼就只有兩行。
示例代碼1 如何讀取數(shù)據(jù)
BufferedSource bufferedSource = null;
try {
File file = new File("txt");
bufferedSource = Okio.buffer(Okio.source(file));
String content = bufferedSource.readUtf8();
System.out.println(content);
} catch (IOException e) {
e.printStackTrace();
} finally {
closeQuietly(bufferedSource);
}
實(shí)例代碼2 如何寫入數(shù)據(jù)
BufferedSink bufferedSink = null;
try {
File file = new File("txt");
bufferedSink = Okio.buffer(Okio.Sink(file));
bufferedSink.writeUtf8("i am zhangsan");
} catch (Exception e) {
} finally {
closeQuietly(bufferedSink);
}
實(shí)例代碼3 如何追加文件內(nèi)容
BufferedSink bufferedSink = null;
try {
File file = new File("txt");
bufferedSink = Okio.buffer(Okio.appendSink(file));
bufferedSink.writeUtf8("i am zhengyan");
} catch (Exception e) {
} finally {
closeQuietly(bufferedSink);
}
最后
我自己在嘗試用了再也不想看到Java.io這么臃腫的庫何吝,上面展示了比較簡單的IO操作溉委,當(dāng)然Okio還能做的更多鹃唯。如果你仔細(xì)留意會發(fā)現(xiàn)我們用的最多的BufferedSink BufferedSource里面都會存在一個(gè)Buffer類來支持這緩沖區(qū),我將在下章講解Buffered類在Okio是如何工作原理的薛躬,以及Okio的一些源碼分析俯渤,謝謝大家閱讀。