サーチ…


ダウンロード/実装

最新のJARをダウンロードするか、Maven経由で入手してください:

<dependency>
    <groupId>com.squareup.okio</groupId>
    <artifactId>okio</artifactId>
    <version>1.12.0</version>
</dependency>

またはGradle:

compile 'com.squareup.okio:okio:1.12.0'

PNGデコーダ

PNGファイルのチャンクをデコードすることは実際にはOkioを示しています。

private static final ByteString PNG_HEADER = ByteString.decodeHex("89504e470d0a1a0a");

public void decodePng(InputStream in) throws IOException {
  try (BufferedSource pngSource = Okio.buffer(Okio.source(in))) {
    ByteString header = pngSource.readByteString(PNG_HEADER.size());
    if (!header.equals(PNG_HEADER)) {
      throw new IOException("Not a PNG.");
    }

    while (true) {
      Buffer chunk = new Buffer();

      // Each chunk is a length, type, data, and CRC offset.
      int length = pngSource.readInt();
      String type = pngSource.readUtf8(4);
      pngSource.readFully(chunk, length);
      int crc = pngSource.readInt();

      decodeChunk(type, chunk);
      if (type.equals("IEND")) break;
    }
  }
}

private void decodeChunk(String type, Buffer chunk) {
  if (type.equals("IHDR")) {
    int width = chunk.readInt();
    int height = chunk.readInt();
    System.out.printf("%08x: %s %d x %d%n", chunk.size(), type, width, height);
  } else {
    System.out.printf("%08x: %s%n", chunk.size(), type);
  }
}

バイトストリングとバッファ

バイトストリングとバッファ

Okioは、多くの機能を簡単なAPIにまとめる2つのタイプに基づいて構築されています。

ByteStringはバイトの不変のシーケンスです。文字データの場合、Stringが基本です。 ByteStringはString型の長い兄弟で、バイナリデータを値として扱いやすくしています。このクラスは人間工学に基づいており、16進、基本64、およびUTF-8としてエンコードおよびデコードする方法を知っています。

バッファは可変バイト列です。 ArrayListと同様に、事前にバッファのサイズを変更する必要はありません。バッファはキューとして読み書きします。最後にデータを書き込み、先頭から読み込みます。ポジション、リミット、またはキャパシティを管理する義務はありません。

内部的には、 ByteStringBufferはCPUとメモリを節約するために賢明なことをします。 ByteStringとしてUTF-8文字列をエンコードすると、その文字列への参照がキャッシュされるため、後でデコードすると処理ができなくなります。

Bufferは、セグメントのリンクリストとして実装されます。あるバッファから別のバッファにデータを移動すると、データをコピーするのではなく、セグメントの所有権が再割り当てされます。このアプローチは、マルチスレッドプログラムにとって特に役立ちます。ネットワークと通信するスレッドは、コピーやセレモニーなしでワーカースレッドとデータを交換できます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow