Zoeken…


Downloaden / implementeren

Download de nieuwste JAR of pak via Maven:

<dependency>
    <groupId>com.squareup.okio</groupId>
    <artifactId>okio</artifactId>
    <version>1.12.0</version>
</dependency>

of Gradle:

compile 'com.squareup.okio:okio:1.12.0'

PNG-decoder

Het decoderen van de brokken van een PNG-bestand toont Okio in de praktijk aan.

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

ByteStrings en Buffers

Okio is opgebouwd rond twee typen die veel mogelijkheden in een eenvoudige API verpakken:

ByteString is een onveranderlijke reeks bytes. Voor karaktergegevens is String fundamenteel. ByteString is de lang verloren broer van String, waardoor het gemakkelijk is om binaire gegevens als een waarde te behandelen. Deze klasse is ergonomisch: hij weet zichzelf te coderen en te decoderen als hex, base64 en UTF-8.

Buffer is een veranderlijke reeks bytes. Net als ArrayList hoeft u uw buffer niet van tevoren te dimensioneren. U leest en schrijft buffers als een wachtrij: schrijf gegevens tot het einde en lees ze vanaf de voorkant. Er is geen verplichting om posities, limieten of capaciteiten te beheren.

Intern doen ByteString en Buffer een aantal slimme dingen om CPU en geheugen te besparen. Als u een UTF-8-reeks codeert als ByteString, slaat deze een verwijzing naar die reeks op, zodat u geen werk hoeft te doen als u deze later decodeert.

Buffer is geïmplementeerd als een gekoppelde lijst met segmenten. Wanneer u gegevens van de ene buffer naar de andere verplaatst, wordt het eigendom van de segmenten opnieuw toegewezen in plaats van de gegevens over te dragen. Deze aanpak is met name handig voor multithreaded programma's: een thread die met het netwerk praat, kan gegevens uitwisselen met een werkthread zonder kopiëren of ceremonie.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow