看源码第一步,先去看看官网对okio的介绍:
Okio
首先第一段:
okio对bytes,做了两种形式的封装:ByteString和Buffer。
其中ByteString,是针对字符类的数据,内部封装一个byte数组,封装了大量的encode和decode的方法,如下图。
左边是接收的参数,转化成ByteString后,可以转换为右边的各种常见的编码格式。
ByteString是不支持对byte数组的变动的,所以是immutable。
里面还提到ByteString做了一些优化,可以减少cpu的工作,比如调用encodeUft8时,内部会将转化后的utf8的结果,存在内部的utf8参数中。
第二段:
Buffer。Buffer本质是一个Segment链表,读取和写数据时,又像ArrayList一样,从List头部读取数据,追加数据到List的尾部。
而当需要移动数据时,只需要改变Segment的ownership,而不是拷贝数据。
这种机制非常适合多线程程序。当一个线程从服务端取数据回来以后,工作线程可以直接将数据的ownership改变成自己,而不需要拷贝数据。
okio提供的两种数据结构:Source和Sink,跟java.io中的InputStream和OutputStream很像。他们的区别在于:
- Timeouts:Source和Sink对read和write方法都提供超时机制。
- 易实现:比如像Source,只有read,close,和timeout需要实现。
- 易使用:虽然source只有三个方法需要实现,但是BufferedSource在Source基础上提供了丰富的api。
- 在字节流和字符流中间,没有明显的区别:大家都是字节,再也没有InputStreamReader(针对字符流的reader)这种东西了!
- 易测试。