Okio学习

在看Okhttp的源码过程中,发现了Okhttp是封装了Socket进行网络访问的。然后对于Socket输入输出流进行读写用的是Okio了。Okio的Github上面给了一段实例代码如下:

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);
  }
}

其实把这段代码读懂了以后基本也就会使用Okio了。至于Okio的源码网上有大神分析~。这是一个读取PNG图像文件的源代码。我刚开始不理解为什么这么读PNG文件。搜索了PNG文件的格式后就懂了。PNG文件格式详解:http://blog.csdn.net/hherima/article/details/45847043
得到信息:对于一个PNG文件来说,其文件头总是由位固定的字节来描述的,HEX: 89 50 4E 47 0D 0A 1A 0A。 看到了吗是不是与ByteString.decodeHex("89504e470d0a1a0a"); 这个里面解析的十六进制代码一样。因为PNG文件就是以这个格式开头的。。同理对应着PNG文件的结构,我们就可以用Okio提供的各种read方法将PNG文件完全读取解析出来。。

你可能感兴趣的:(Okio学习)