Android
Окио
Поиск…
Загрузить / Внедрить
Загрузите последнюю версию 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-файла демонстрирует на практике Окио.
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);
}
}
ByteStrings и Buffers
ByteStrings и Buffers
Окио построено на двух типах, которые добавляют много возможностей в простой API:
ByteString - неизменная последовательность байтов. Для символьных данных String является фундаментальным. ByteString - потерянный брат String, позволяющий легко обрабатывать двоичные данные как ценность. Этот класс эргономичен: он умеет кодировать и декодировать себя как hex, base64 и UTF-8.
Буфер - изменяемая последовательность байтов. Как ArrayList, вам не нужно заранее настраивать буфер. Вы читаете и записываете буферы в очередь: записываете данные до конца и читаете их спереди. Нет никаких обязательств по управлению позициями, лимитами или возможностями.
Внутренне, ByteString
и Buffer
делают некоторые умные вещи для экономии процессора и памяти. Если вы кодируете строку UTF-8 как ByteString, она кэширует ссылку на эту строку, так что, если вы ее декодируете позже, работы не будет.
Buffer
реализуется как связанный список сегментов. Когда вы перемещаете данные из одного буфера в другой, он переназначает владение сегментами, а не копирует данные. Этот подход особенно полезен для многопоточных программ: поток, который ведет переговоры с сетью, может обмениваться данными с рабочим потоком без какого-либо копирования или церемонии.