Android
Okio
サーチ…
ダウンロード/実装
最新の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と同様に、事前にバッファのサイズを変更する必要はありません。バッファはキューとして読み書きします。最後にデータを書き込み、先頭から読み込みます。ポジション、リミット、またはキャパシティを管理する義務はありません。
内部的には、 ByteString
とBuffer
はCPUとメモリを節約するために賢明なことをします。 ByteStringとしてUTF-8文字列をエンコードすると、その文字列への参照がキャッシュされるため、後でデコードすると処理ができなくなります。
Buffer
は、セグメントのリンクリストとして実装されます。あるバッファから別のバッファにデータを移動すると、データをコピーするのではなく、セグメントの所有権が再割り当てされます。このアプローチは、マルチスレッドプログラムにとって特に役立ちます。ネットワークと通信するスレッドは、コピーやセレモニーなしでワーカースレッドとデータを交換できます。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow