Ricerca…


Scarica / Implementa

Scarica l'ultimo JAR o acquisisci tramite 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'

Decodificatore PNG

Decodificare i blocchi di un file PNG dimostra in pratica Okio.

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 e Buffers

ByteStrings e Buffers

Okio è costruito attorno a due tipi che racchiudono molte funzionalità in un'API semplice:

ByteString è una sequenza immutabile di byte. Per i dati dei personaggi, String è fondamentale. ByteString è il fratello perduto di String, rendendo facile trattare i dati binari come un valore. Questa classe è ergonomica: sa come codificare e decodificare se stessa come hex, base64 e UTF-8.

Il buffer è una sequenza mutabile di byte. Come ArrayList, non è necessario dimensionare il buffer in anticipo. Si leggono e scrivono i buffer come coda: scrivere i dati fino alla fine e leggerli dal lato anteriore. Non vi è alcun obbligo di gestire posizioni, limiti o capacità.

Internamente, ByteString e Buffer fanno cose intelligenti per risparmiare CPU e memoria. Se codifichi una stringa UTF-8 come ByteString, memorizza nella cache un riferimento a quella stringa in modo che se decodifichi in seguito, non c'è lavoro da fare.

Buffer è implementato come un elenco di segmenti collegati. Quando si spostano i dati da un buffer a un altro, viene riassegnata la proprietà dei segmenti anziché la copia dei dati. Questo approccio è particolarmente utile per i programmi multithread: un thread che comunica con la rete può scambiare dati con un thread di lavoro senza alcuna copia o cerimonia.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow