一文詳解Android中Okio輸入輸出流
一、輸入輸出
在正式介紹 Okio 之前,讓我們先回憶一下輸入/輸出流
的概念。
輸入流:外設——>內(nèi)存
將數(shù)據(jù)從各種外設(如鍵盤、文件、網(wǎng)絡、數(shù)據(jù)庫等)讀取到內(nèi)存中;
-
輸出流:內(nèi)存——>外設
與輸入流相反,是將內(nèi)存數(shù)據(jù)寫入到各種外設(如文件、網(wǎng)絡、數(shù)據(jù)庫、顯示器等);
二、Okio簡介
Okio最初是作為OkHttp的一個組件
出現(xiàn),是 OkHttp 實現(xiàn)HTTP協(xié)議數(shù)據(jù)構(gòu)建、解析中使用到的底層 IO 庫。其相比于傳統(tǒng)的 java.io 和 java.nio ,其在文件
、網(wǎng)絡
等數(shù)據(jù)讀寫操作更加便捷、高效
。
Okio
的設計思想是將數(shù)據(jù)的讀寫
操作封裝為一個統(tǒng)一的接口,即 Source
和 Sink
,其中 輸入為Source,輸出為Sink 。
Okio
還提供了Buffer
和ByteString
用于封裝和操作字節(jié)數(shù)據(jù)
,提高數(shù)據(jù)讀寫的效率。- 同時,
Okio
還提供了一些工具方法,例如從InputStream
或OutputStream
中創(chuàng)建BufferedSource
、BufferedSink
等。
三、引入Okio
Okio官方API地址為:Okio (square.github.io)
Okio Github開源地址為: GitHub - square/okio: A modern I/O library for Android, Java, and Kotlin Multiplatform.
使用 Okio 時,我們可以查閱官方最新版本,并通過如下方式引入Okio:
implementation("com.squareup.okio:okio:3.2.0")
四、API 簡介及使用
- Buffer 簡介及API使用介紹
- ByteString 簡介及API使用介紹
- Source 和 Sink 使用介紹
4.1 Buffer
Buffer
是一個大小可變的字節(jié)緩沖區(qū)
,在Okio中Buffer
是BufferedSource
和BufferedSink
的接口實現(xiàn)類,用戶實現(xiàn)字節(jié)數(shù)據(jù)的緩沖與讀寫。
官方API描述如下:
Buffer
可以像Arraylist
一樣,不需要預先設置緩沖區(qū)的大小,而是隨著數(shù)據(jù)的增加自動擴充緩沖區(qū)大小
。Buffer
由很多的Segment
片段構(gòu)成,每個Segment
中維護一個字節(jié)數(shù)組
。Buffer
中以鏈表的形式來管理Segment
,當使用Buffer
進行緩沖區(qū)字節(jié)數(shù)據(jù)移動時,其只改變Segment
字節(jié)數(shù)組的所有權(quán),從而提高字節(jié)數(shù)組的移動效率。
okio.Buffer
字節(jié)緩沖區(qū)的使用方式舉例如下:
import okio.Buffer; Buffer buffer = new Buffer(); // 向緩沖區(qū)寫入數(shù)據(jù) buffer.writeUtf8("key"); buffer.writeByte('='); buffer.writeUtf8("value"); // 緩沖區(qū)字節(jié)大小 int byteCount = buffer.size(); // 讀取換區(qū)中的全部字節(jié)數(shù)據(jù) byte[] byteArray = buffer.readByteArray(); // 以Utf8編碼的形式輸出所有字符串 String result = buffer.readUtf8(); // 清空緩沖區(qū) buffer.clear();
4.2 ByteString
ByteString
中維護了大小不可變的字節(jié)數(shù)組
,其可以對存入該字節(jié)數(shù)組的數(shù)據(jù)進行base64
、utf8
、md5
、sha256
等字符串的編解碼操作。 ByteString
更像是一個工具類,在Okio
中其重要應用場景也是在網(wǎng)絡傳輸中對數(shù)據(jù)進行編碼和解碼工作
。
官方API描述如下:
其部分靜態(tài)方法和公有方法如下圖所示:
okio.ByteString
的使用方式舉例如下:
import okio.ByteString; // utf8編碼 ByteString byteString = ByteString.encodeUtf8("hello"); // HEX ByteString byteString = ByteString.decodeHex("hello"); // 輸出utf8字符串 String result = byteString.utf8();
4.3 Source 和 Sink
Source 和 Sink 在前文中提到過輸入為Source,輸出為Sink。在 Okio 中,Source
和 Sink
用于讀取
和寫入
數(shù)據(jù)的抽象類
,其提供了一組標準的IO讀寫方法,可以方便地進行數(shù)據(jù)的讀寫操作。
// Okio源碼:輸入流 Source // Source 接口類,最主要的方法是 read public interface Source extends Closeable { // 讀字節(jié)數(shù)據(jù) long read(Buffer var1, long var2) throws IOException; // timeout Timeout timeout(); void close() throws IOException; } // Okio源碼:輸出流 Sink // Sink 接口類,最主要的方法是 write public interface Sink extends Closeable, Flushable { // 寫字節(jié)數(shù)據(jù) void write(Buffer var1, long var2) throws IOException; void flush() throws IOException; Timeout timeout(); void close() throws IOException; }
在把前文已經(jīng)展示過的Okio結(jié)構(gòu)圖拿出來:
Source
的最終實現(xiàn)類是RealBufferedSource
;Sink
的最終實現(xiàn)類是RealBufferedSink
;
使用 okio.Source
從文件中讀取數(shù)據(jù),代碼舉例如下:
// 使用 Source 從文件中讀取數(shù)據(jù) public static void readLines(File file) throws IOException { // 輸入流 Source fileSource = Okio.source(file); // 構(gòu)建 BufferedSource RealBufferedSource bufferedSource = Okio.buffer(fileSource); // 循環(huán)讀取 while (true) { // 讀取行數(shù)據(jù) String line = bufferedSource.readUtf8Line(); if (line == null) { break; } } }
使用 okio.Sink
向文件中寫入數(shù)據(jù),代碼舉例如下:
// 使用 Sink 向文件中寫入數(shù)據(jù) public static void writeToFile(File file) throws IOException { // 創(chuàng)建輸出流 Sink fileSink = Okio.sink(file); // 構(gòu)造 BufferedSink RealBufferedSink bufferedSink = Okio.buffer(fileSink); // 向文件中寫入數(shù)據(jù) bufferedSink.writeUtf8("Hello"); bufferedSink.writeUtf8("\n"); bufferedSink.writeAll(Okio.source(new File("my.txt"))); }
以上就是一文詳解Android中Okio輸入輸出流的詳細內(nèi)容,更多關(guān)于Android Okio輸入輸出流的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android中檢查、監(jiān)聽電量和充電狀態(tài)的方法
這篇文章主要介紹了Android中檢查、監(jiān)聽電量和充電狀態(tài)的方法,如判斷當前充電狀態(tài)、監(jiān)聽充電狀態(tài)的改變、判斷當前剩余電量等,需要的朋友可以參考下2014-06-06Android自定義ViewGroup實現(xiàn)豎向引導界面
這篇文章主要為大家詳細介紹了Andoird自定義ViewGroup實現(xiàn)豎向引導界面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03Android編程自定義對話框(Dialog)位置及大小的方法
這篇文章主要介紹了Android編程自定義對話框(Dialog)位置及大小的方法,涉及Android對話框的定義、功能、屬性及布局相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Android編程實現(xiàn)3D立體旋轉(zhuǎn)效果的實例代碼
這篇文章主要介紹了Android編程實現(xiàn)3D立體旋轉(zhuǎn)效果的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05