Android
Okio
Recherche…
Télécharger / Implémenter
Téléchargez le dernier JAR ou récupérez-le via Maven:
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>1.12.0</version>
</dependency>
ou Gradle:
compile 'com.squareup.okio:okio:1.12.0'
Décodeur PNG
Le décodage des morceaux d'un fichier PNG montre Okio en pratique.
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);
}
}
ByteString et Buffers
ByteString et Buffers
Okio est construit autour de deux types qui intègrent beaucoup de fonctionnalités dans une API simple:
ByteString est une séquence immuable d'octets. Pour les données de caractères, String est fondamental. ByteString est le frère perdu depuis longtemps de String, ce qui facilite le traitement des données binaires en tant que valeur. Cette classe est ergonomique: elle sait encoder et se décoder en hex, base64 et UTF-8.
La mémoire tampon est une séquence de bits modifiable. Comme ArrayList, vous n'avez pas besoin de dimensionner votre tampon à l'avance. Vous lisez et écrivez des tampons en tant que file d'attente: écrivez les données à la fin et lisez-les à partir du recto. Il n'y a aucune obligation de gérer les positions, les limites ou les capacités.
En interne, ByteString
et Buffer
font des choses intelligentes pour économiser le processeur et la mémoire. Si vous encodez une chaîne UTF-8 en tant que ByteString, elle met en cache une référence à cette chaîne afin que, si vous la décodez plus tard, cela ne fonctionne plus.
Buffer
est implémenté en tant que liste de segments liée. Lorsque vous déplacez des données d'un tampon à un autre, il réaffecte la propriété des segments plutôt que de copier les données. Cette approche est particulièrement utile pour les programmes multithread: un thread qui communique avec le réseau peut échanger des données avec un thread de travail sans aucune copie ni cérémonie.