Android
Okio
Sök…
Ladda ner / implementera
Ladda ner den senaste JAR eller ta tag via Maven:
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>1.12.0</version>
</dependency>
eller Gradle:
compile 'com.squareup.okio:okio:1.12.0'
PNG-avkodare
Avkodning av bitarna av en PNG-fil demonstrerar Okio i praktiken.
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 och buffertar
ByteStrings och buffertar
Okio är byggd kring två typer som packar mycket kapacitet i ett enkelt API:
ByteString är en immutable sekvens av byte. För teckeninformation är String grundläggande. ByteString är Strings länge förlorade bror, vilket gör det enkelt att behandla binär data som ett värde. Denna klass är ergonomisk: den vet hur man kodar och avkodar sig själv som hex, base64 och UTF-8.
Buffert är en muterbar sekvens av byte. Liksom ArrayList behöver du inte storlek på din buffert i förväg. Du läser och skriver buffertar som en kö: skriver data till slutet och läser dem framifrån. Det finns ingen skyldighet att hantera positioner, gränser eller kapacitet.
Internt gör ByteString
och Buffer
några smarta saker för att spara CPU och minne. Om du kodar en UTF-8-sträng som en ByteString, cachar den en referens till den strängen så att om du avkodar den senare, finns det inget arbete att göra.
Buffer
implementeras som en länkad lista över segment. När du flyttar data från en buffert till en annan tilldelar den ägarskapet till segmenten snarare än att kopiera data över. Detta tillvägagångssätt är särskilt användbart för multithreaded-program: en tråd som pratar med nätverket kan utbyta data med en arbetartråd utan kopiering eller ceremoni.