在看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文件完全读取解析出来。。