Android
Okio
Buscar..
Descargar / Implementar
Descarga la última versión de JAR o graba a través de 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'
Decodificador PNG
La decodificación de los fragmentos de un archivo PNG demuestra Okio en la práctica.
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 y Buffers
ByteStrings y Buffers
Okio se basa en dos tipos que combinan muchas capacidades en una API sencilla:
ByteString es una secuencia inmutable de bytes. Para datos de personajes, String es fundamental. ByteString es el hermano perdido de String, lo que facilita el tratamiento de los datos binarios como un valor. Esta clase es ergonómica: sabe cómo codificarse y decodificarse como hexadecimal, base64 y UTF-8.
Buffer es una secuencia mutable de bytes. Al igual que ArrayList, no es necesario que dimensione su búfer por adelantado. Lee y escribe buffers como una cola: escriba datos al final y léalos desde el frente. No hay obligación de gestionar posiciones, límites o capacidades.
Internamente, ByteString
y Buffer
hacen algunas cosas inteligentes para ahorrar CPU y memoria. Si codifica una cadena UTF-8 como ByteString, almacena en caché una referencia a esa cadena para que si la decodifica más tarde, no haya trabajo que hacer.
Buffer
se implementa como una lista de segmentos vinculados. Cuando mueve los datos de un búfer a otro, se reasigna la propiedad de los segmentos en lugar de copiar los datos. Este enfoque es particularmente útil para los programas multiproceso: un subproceso que habla a la red puede intercambiar datos con un subproceso de trabajo sin ningún tipo de copia o ceremonia.