Android
Okio
Ricerca…
Scarica / Implementa
Scarica l'ultimo JAR o acquisisci tramite Maven:
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>1.12.0</version>
</dependency>
o Gradle:
compile 'com.squareup.okio:okio:1.12.0'
Decodificatore PNG
Decodificare i blocchi di un file PNG dimostra in pratica 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);
}
}
ByteStrings e Buffers
ByteStrings e Buffers
Okio è costruito attorno a due tipi che racchiudono molte funzionalità in un'API semplice:
ByteString è una sequenza immutabile di byte. Per i dati dei personaggi, String è fondamentale. ByteString è il fratello perduto di String, rendendo facile trattare i dati binari come un valore. Questa classe è ergonomica: sa come codificare e decodificare se stessa come hex, base64 e UTF-8.
Il buffer è una sequenza mutabile di byte. Come ArrayList, non è necessario dimensionare il buffer in anticipo. Si leggono e scrivono i buffer come coda: scrivere i dati fino alla fine e leggerli dal lato anteriore. Non vi è alcun obbligo di gestire posizioni, limiti o capacità.
Internamente, ByteString
e Buffer
fanno cose intelligenti per risparmiare CPU e memoria. Se codifichi una stringa UTF-8 come ByteString, memorizza nella cache un riferimento a quella stringa in modo che se decodifichi in seguito, non c'è lavoro da fare.
Buffer
è implementato come un elenco di segmenti collegati. Quando si spostano i dati da un buffer a un altro, viene riassegnata la proprietà dei segmenti anziché la copia dei dati. Questo approccio è particolarmente utile per i programmi multithread: un thread che comunica con la rete può scambiare dati con un thread di lavoro senza alcuna copia o cerimonia.