okhttp中的Okio实现原理
2017-03-08 15:19
127 查看
okhttp中使用到的Okio对IO的操作进行了自己的封装,Okio拥有自己的缓存,Okio的读写都会经过自己的缓存,而Okio的缓存采用了池化的思想,也就是并不是用完了分配的内存就立即释放,在频繁读写的时候,提高了一定的性能。
Okio的主要类图如下:
Okio主要类的方法一栏如下:
BufferedSource接口主要用来读取,BufferedSink接口主要用来写入;读取的源头来自于一股输入流,我们会用Okio工具类的source方法获取一个RealBufferedSource类来读入,写出的目的地是一股输出流,我们会用Okio工具类的sink方法获取RealBufferedSink类来写出;RealBufferedSource会读入到Buffer,同样RealBufferedSink写出会先写出到Buffer,读入的时候,不一定读入输入流中的全部数据到Buffer,视读入方法而定,写出的时候,不会全部写出到输出流,包括writeAll方法也不是全部写出到输出流,而只是把Buffer中满的Segment写出到输出流,然后在flush和close的时候,才会把Buffer中剩余的不满的Segment写出到输出流。而从输入流读入和写出到输出流这2个任务其实是分别交给了SourceImpl和SinkImpl来实现。
Buffer对内存做了简单的管理,它把内存看成一条环状的Segment链,每一个Segment有8192个字节大小,对Segment的使用也是使用了池化的思想,Buffer需要的时候从池里获取,不用的时候放入池中,下面是Buffer的示意图:
Okio的主要类图如下:
Okio主要类的方法一栏如下:
BufferedSource接口主要用来读取,BufferedSink接口主要用来写入;读取的源头来自于一股输入流,我们会用Okio工具类的source方法获取一个RealBufferedSource类来读入,写出的目的地是一股输出流,我们会用Okio工具类的sink方法获取RealBufferedSink类来写出;RealBufferedSource会读入到Buffer,同样RealBufferedSink写出会先写出到Buffer,读入的时候,不一定读入输入流中的全部数据到Buffer,视读入方法而定,写出的时候,不会全部写出到输出流,包括writeAll方法也不是全部写出到输出流,而只是把Buffer中满的Segment写出到输出流,然后在flush和close的时候,才会把Buffer中剩余的不满的Segment写出到输出流。而从输入流读入和写出到输出流这2个任务其实是分别交给了SourceImpl和SinkImpl来实现。
Buffer对内存做了简单的管理,它把内存看成一条环状的Segment链,每一个Segment有8192个字节大小,对Segment的使用也是使用了池化的思想,Buffer需要的时候从池里获取,不用的时候放入池中,下面是Buffer的示意图:
相关文章推荐
- OkHttp的实现原理(一)之同步
- 以 Okhttp3源码 为例 ------ 图解 缓存机制 的原理和实现(下)
- 以 Okhttp3源码 为例 ------ 图解 缓存机制 的原理和实现(上)
- 优雅设计封装基于Okhttp3的网络框架(二):多线程下载功能原理设计 及 简单实现
- OkHttp的实现原理(二)之异步
- OkHttp3使用解析:实现下载进度的监听及其原理简析
- .NET 1.1中预编译ASP.NET页面实现原理浅析 [1] 自动预编译机制浅析
- P2P之UDP穿透NAT的原理与实现 [转]
- P2P 之 UDP穿透NAT的原理与实现-转自CSDN[hBifTs]
- C# 2.0 中Iterators的改进与实现原理浅析
- 利用泛解析实现二级域名原理以及程序
- 一个小语言的词法分析程序原理及其实现(2)
- .NET 1.1中预编译ASP.NET页面实现原理浅析 [1] 自动预编译机制浅析
- 基于IMD的包过滤防火墙原理与实现
- RunDll32 的使用方法与实现原理
- CLR 中匿名函数的实现原理浅析
- OICQ登录号码清除器实现原理
- 自解压的jar实现原理
- C# 2.0 中Iterators的改进与实现原理浅析
- gzip原理与实现