Okio源码分析.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Okio源码分析

Okio源码分析 1. okio概念 okio是一个由square公司开发的开源库,它弥补了Java.io和java.nio的不足,能够更方便快速的读取、存储和处理数据。 okio有自己的流类型Source和Sink,对应于java.io的InputStream和OutputStream。 okio内部引入了ByteString和Buffer,提升了效率和性能。 okio引入了超时机制。 okio规模不大,代码精巧,是源码学习的好素材 2. Source和Sink Source代表输入流,Sink代表输出流,Source和Sink的实现逻辑基本相似,以Source为例,学习一下它的实现原理,首先来看一下Source的源码: package okio; import java.io.Closeable; import java.io.IOException; public interface Source extends Closeable { /** * 将此source输入流中的数据移动到sink中(至少1字节,至多byteCount字节) * 返回移动的字节数,source读完为空时返回-1 */ long read(Buffer sink, long byteCount) throws IOException; /** 超时机制 */ Timeout timeout(); /** * 关闭此source输入流并释放此source输入流持有的所有资源 * 关闭后的source输入流不能再进行读取 * 及时关闭source输入流 */ @Override void close() throws IOException; } source相比于java.io的InputStream精简很多,它的具体功能通过装饰器模式在它的装饰类中实现,整体的认识一下Source和它的装饰器的实现关系: GzipSource为支持gzip压缩的实现类,InflaterSource为GzipSource服务,用于压缩;ForwardingSource是一个具有委托功能的抽象类。 其中BufferedSource为实现Source支持缓冲区的子类接口,其中定义了缓冲区及多种类型的读方法,源码如下: package okio; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; public interface BufferedSource extends Source { Buffer buffer(); boolean exhausted() throws IOException; void require(long byteCount) throws IOException; boolean request(long byteCount) throws IOException; byte readByte() throws IOException; short readShort() throws IOException; short readShortLe() throws IOException; int readInt() throws IOException; ...... } RealBufferedSource为BufferedSource的实现类,通常情况下我们对输入流的操作都是在操作RealBufferedSource,RealBufferedSource类中有两个主要参数,一个是Source对象,一个是新建的Buffer对象,而各种读方法都是通过Buffer来具体实现的,比如readByteArray方法: @Override public byte[] readByteArray() throws IOException { buffer.writeAll(source); return buffer.readByteArray(); } 可见虽然这个类叫RealBufferedSource,但是实际上只是一个保存Buffer对象的一个代理实现,真正的实现都是在Buffer中实现的,而正是通过Buffer的应用,才实现了okio的高效性。 3. Buffer Buffer是BufferedSink和BufferedSource的实现类,因此它既可以用来读数据,也可以用来写数据。在Buffer的注释中说明了okio的高效性: copy数组时仅仅改变底层字节数组的所有权,而不是把数据从

文档评论(0)

jiupshaieuk12 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档