Android
Okio
Suche…
Herunterladen / Implementieren
Lade das neueste JAR herunter oder greife über Maven:
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>1.12.0</version>
</dependency>
oder Gradle:
compile 'com.squareup.okio:okio:1.12.0'
PNG-Decoder
Die Dekodierung der Chunks einer PNG-Datei zeigt Okio in der Praxis.
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 und Puffer
ByteStrings und Puffer
Okio basiert auf zwei Typen, die viele Funktionen in eine unkomplizierte API integrieren:
ByteString ist eine unveränderliche Folge von Bytes. Für Zeichendaten ist String grundlegend. ByteString ist der lange verlorene Bruder von String, wodurch es einfach ist, binäre Daten als Wert zu behandeln. Diese Klasse ist ergonomisch: Sie kann sich selbst als Hex, Base64 und UTF-8 kodieren und dekodieren.
Puffer ist eine veränderliche Folge von Bytes. Wie bei ArrayList müssen Sie den Puffer nicht im Voraus anpassen. Sie lesen und schreiben Puffer als Warteschlange: Schreiben Sie die Daten an das Ende und lesen Sie sie von vorne. Es besteht keine Verpflichtung, Positionen, Limits oder Kapazitäten zu verwalten.
Intern tun ByteString
und Buffer
einige clevere Dinge, um CPU und Speicher zu sparen. Wenn Sie einen UTF-8-String als ByteString codieren, speichert er einen Verweis auf diesen String, sodass Sie beim späteren Dekodieren keine weiteren Schritte ausführen müssen.
Buffer
wird als verknüpfte Liste von Segmenten implementiert. Wenn Sie Daten von einem Puffer in einen anderen verschieben, wird der Besitz der Segmente neu zugewiesen, anstatt die Daten zu kopieren. Dieser Ansatz ist besonders für Multithread-Programme hilfreich: Ein Thread, der mit dem Netzwerk kommuniziert, kann Daten mit einem Worker-Thread austauschen, ohne dass er kopiert oder zeremoniert werden muss.