Okio
OkHttp のソースコードにはの図がよく見られますが、この記事ではそれをOkio
取り出して詳細な紹介と考察を行います。
- 入力と出力の概念の簡単な紹介
- オキオの紹介
- オキオをプロジェクトに紹介する
- APIの紹介と使い方の紹介
1. 入力と出力
输入/输出流
okio を正式に紹介する前に、まずokio の概念を思い出してみましょう。
输入流:外设——>内存
さまざまな周辺機器 (キーボード、ファイル、ネットワーク、データベースなど) からメモリにデータを読み取ります。
输出流:内存——>外设
入力ストリームとは逆に、メモリ データをさまざまな周辺機器 (ファイル、ネットワーク、データベース、ディスプレイなど) に書き込みます。
2.OKIOの紹介
Okio最初是作为OkHttp的一个组件
どうやら、これは OkHttp が HTTP プロトコル データの構築と分析を実装するために使用する基礎となる IO ライブラリです。従来の java.io および java.nio と比較して、文件
など网络
のデータの読み取りおよび書き込み操作を実行します更加便捷、高效
。
Okio
の設計思想は、データ读写
操作を統合インターフェイス、つまりSource
とにカプセル化することですSink
。ここで、入力は Source 、出力は Sink です。
Okio
データの読み書きの効率を向上させるためにも提供されていますBuffer
。ByteString
封装和操作字节数据
- 同時に、やから作成する
Okio
など、いくつかのツールメソッドも提供されます。InputStream
OutputStream
BufferedSource
BufferedSink
3. オキオの紹介
公式のOKIO APIアドレスは:
https://square.github.io/okio/
OKO Github オープンソースのアドレスは:
https://github.com/square/okio
Okio を使用する場合、次の方法で公式の最新バージョンを確認し、Okio を導入できます。
implementation("com.squareup.okio:okio:3.2.0")
4. APIの導入と利用
- バッファの紹介とAPIの使い方の紹介
- ByteString の概要と API の使用法について
- ソースとシンクの使用方法の紹介
4.1 バッファ
Buffer
はい、これは一个大小可变的字节缓冲区
okio のおよび のインターフェイス実装クラスであり、ユーザーはバイト データのバッファリングと読み書きを実現します。Buffer
BufferedSource
BufferedSink
公式の API 説明は次のとおりです。
Buffer
このように行うことができArraylist
、バッファのサイズを事前に設定する必要はありませんが、それに伴います数据的增加自动扩充缓冲区大小
。Buffer
多くのSegment
フラグメントで構成され、各Segment
に 1 つが保持されます字节数组
。Buffer
リンクリスト形式で管理されており、バッファバイトデータ移動Segment
を利用する場合、バイト配列の所有権を変更するだけなので、バイト配列の移動効率が向上します。Buffer
Segment
okio.Buffer
バイト バッファの使用例は次のとおりです。
import okio.Buffer;
Buffer buffer = new Buffer();
// 向缓冲区写入数据
buffer.writeUtf8("key");
buffer.writeByte('=');
buffer.writeUtf8("value");
// 缓冲区字节大小
int byteCount = buffer.size();
// 读取换区中的全部字节数据
byte[] byteArray = buffer.readByteArray();
// 以Utf8编码的形式输出所有字符串
String result = buffer.readUtf8();
// 清空缓冲区
buffer.clear();
4.2 バイト文字列
ByteString
これは で維持されており、大小不可变的字节数组
バイト配列に格納されたデータのbase64
、utf8
、md5
などsha256
の文字列をエンコードおよびデコードできます。これは、重要なアプリケーション シナリオである
ByteString
ツール クラスに似ています。Okio
也是在网络传输中对数据进行编码和解码工作
公式の API 説明は次のとおりです。
静的メソッドとパブリック メソッドの一部を次の図に示します。
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 であると前述しました。okioSource
およびデータでSink
は、データの読み取りおよび書き込み操作を容易にする一連の標準 IO 読み取りおよび書き込みメソッドが提供されます读取
。写入
抽象类
// Okio源码:输入流 Source
// Source 接口类,最主要的方法是 read
public interface Source extends Closeable {
// 读字节数据
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 {
// 写字节数据
void write(Buffer var1, long var2) throws IOException;
void flush() throws IOException;
Timeout timeout();
void close() throws IOException;
}
上に示したOKIOの構造図を取り出します。
Source
の最終的な実装クラスはRealBufferedSource
;Sink
の最終的な実装クラスはRealBufferedSink
;
okio.Source
ファイルからデータを読み取るために使用します。コード例は次のとおりです。
// 使用 Source 从文件中读取数据
public static void readLines(File file) throws IOException {
// 输入流
Source fileSource = Okio.source(file);
// 构建 BufferedSource
RealBufferedSource bufferedSource = Okio.buffer(fileSource);
// 循环读取
while (true) {
// 读取行数据
String line = bufferedSource.readUtf8Line();
if (line == null) {
break;
}
}
}
okio.Sink
データをファイルに書き込むために使用します。コード例は次のとおりです。
// 使用 Sink 向文件中写入数据
public static void writeToFile(File file) throws IOException {
// 创建输出流
Sink fileSink = Okio.sink(file);
// 构造 BufferedSink
RealBufferedSink bufferedSink = Okio.buffer(fileSink);
// 向文件中写入数据
bufferedSink.writeUtf8("Hello");
bufferedSink.writeUtf8("\n");
bufferedSink.writeAll(Okio.source(new File("my.txt")));
}
5. 参考資料
OKIO API:
https://square.github.io/okio/
okio Github:
https://github.com/square/okio
Java ストリーム:
http://c.biancheng.net/view/1119.html
=終わり=
この記事は「CODING Technology Pavilion」公式アカウントで公開したものですが、記事が参考になった場合は私の公式アカウントにも注目してください。