OKIO の入出力ストリームの詳細な説明

OkioOkHttp のソースコードにはの図がよく見られますが、この記事ではそれをOkio取り出して詳細な紹介と考察を行います。

  • 入力と出力の概念の簡単な紹介
  • オキオの紹介
  • オキオをプロジェクトに紹介する
  • APIの紹介と使い方の紹介

1. 入力と出力

输入/输出流okio を正式に紹介する前に、まずokio の概念を思い出してみましょう。

  • 输入流:外设——>内存
    さまざまな周辺機器 (キーボード、ファイル、ネットワーク、データベースなど) からメモリにデータを読み取ります。
    入力ストリーム: 周辺機器 --> メモリ
  • 输出流:内存——>外设
    入力ストリームとは逆に、メモリ データをさまざまな周辺機器 (ファイル、ネットワーク、データベース、ディスプレイなど) に書き込みます。
    出力ストリーム: メモリ --> 周辺機器

2.OKIOの紹介

Okio最初是作为OkHttp的一个组件どうやら、これは OkHttp が HTTP プロトコル データの構築と分析を実装するために使用する基礎となる IO ライブラリです。従来の java.io および java.nio と比較して、文件など网络のデータの読み取りおよび書き込み操作を実行します更加便捷、高效

沖尾主構造

Okioの設計思想は、データ读写操作を統合インターフェイス、つまりSourceとにカプセル化することですSink。ここで、入力は Source 、出力は Sink です

  • Okioデータの読み書きの効率を向上させるためにも提供されていますBufferByteString封装和操作字节数据
  • 同時に、やから作成するOkioなど、いくつかのツールメソッドも提供されますInputStreamOutputStreamBufferedSourceBufferedSink

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 のおよび のインターフェイス実装クラスであり、ユーザーはバイト データのバッファリングと読み書きを実現します。BufferBufferedSourceBufferedSink

公式の API 説明は次のとおりです。
公式APIの説明

  • Bufferこのように行うことができArraylist、バッファのサイズを事前に設定する必要はありませんが、それに伴います数据的增加自动扩充缓冲区大小
  • Buffer多くのSegmentフラグメントで構成され、各Segmentに 1 つが保持されます字节数组
  • Bufferリンクリスト形式で管理されており、バッファバイトデータ移動Segmentを利用する場合、バイト配列の所有権を変更するだけなので、バイト配列の移動効率が向上します。BufferSegment

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これは で維持されており、大小不可变的字节数组バイト配列に格納されたデータのbase64utf8md5などsha256の文字列をエンコードおよびデコードできます。これは、重要なアプリケーション シナリオである
ByteStringツール クラスに似ていますOkio也是在网络传输中对数据进行编码和解码工作

公式の API 説明は次のとおりです。
公式APIの説明

静的メソッドとパブリック メソッドの一部を次の図に示します。

ByteString の静的メソッド

ByteString のパブリック メソッド

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」公式アカウントで公開したものですが、記事が参考になった場合は私の公式アカウントにも注目してください。

おすすめ

転載: blog.csdn.net/aiwusheng/article/details/131716994