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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow