Android
Okej
Szukaj…
Pobierz / Implementuj
Pobierz najnowszy plik JAR lub pobierz za pośrednictwem Maven:
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>1.12.0</version>
</dependency>
lub Gradle:
compile 'com.squareup.okio:okio:1.12.0'
Dekoder PNG
Dekodowanie fragmentów pliku PNG pokazuje Okio w praktyce.
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 and Buffers
ByteStrings and Buffers
Okio opiera się na dwóch typach, które mają wiele możliwości w prostym interfejsie API:
ByteString to niezmienna sekwencja bajtów. W przypadku danych znakowych ciąg ma podstawowe znaczenie. ByteString jest dawno zaginionym bratem Stringa, co ułatwia traktowanie danych binarnych jako wartości. Ta klasa jest ergonomiczna: umie kodować i dekodować się jako hex, base64 i UTF-8.
Bufor to zmienna sekwencja bajtów. Podobnie jak ArrayList, nie musisz wcześniej zmieniać rozmiaru bufora. Odczytujesz i zapisujesz bufory jako kolejkę: zapisuj dane do końca i czytaj od przodu. Nie ma obowiązku zarządzania pozycjami, limitami ani zdolnościami.
Wewnętrznie ByteString
i Buffer
robią sprytne rzeczy, aby zaoszczędzić procesor i pamięć. Jeśli kodujesz ciąg UTF-8 jako ByteString, buforuje on odwołanie do tego ciągu, więc jeśli zdekodujesz go później, nie będziesz musiał nic robić.
Buffer
jest implementowany jako połączona lista segmentów. Przeniesienie danych z jednego bufora do drugiego powoduje przeniesienie własności segmentów zamiast kopiowania danych. Takie podejście jest szczególnie przydatne w przypadku programów wielowątkowych: wątek komunikujący się z siecią może wymieniać dane z wątkiem roboczym bez kopiowania lub ceremonii.