安卓中IO机制概要
一、basic IO和NIO
(1)内核空间
内核:一套软件,操作系统用于支撑基础使用的功能程序
(2)数据读写的方案
内核空间对于IO的操作方案:
页:4K数据为一页, 一页数据是IO操作的基本单位
空间局部性原理:在常规操作下, 如果数据量较大的情况下可能会出现预占位4~16K的情况
(3)JAVA 对于Basic IO 的支撑
(4)MappedByteBuffer缓冲区
java io操作中通常采用BufferedReader,BufferedInputStream等带缓冲的IO类处理大文件,不过java nio中引入了一种基于MappedByteBuffer操作大文件的方式,其读写性能极高
FileChannel提供了map方法把文件映射到虚拟内存,通常情况可以映射整个文件,如果文件比较大,可以进行分段映射。
MappedByteBuffer使用虚拟内存,因此分配(map)的内存大小不受JVM的-Xmx参数限制,但是也是有大小限制的。
(5)OKIO 采取的方案
OK在读取数据时,先从Buffer对象中获取了一个Segment,然后向Segment中读取数据,每个Segment最多可以存入8K数据。这里需要提一下Buffer中数据的数据结构,Buffer中的数据是存在于一个双向链表中,链表中的每个节点都是一个Segment...
二、安卓中IO的序列化
(1)序列化定义以及相关概念
序列化本质上其实就是将数据结构或对象转换成二进制串的过程。
反序列化本质是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
(2)Android中序列化方案
Serializable接口
Serializable 用来标识当前类可以被 ObjectOutputStream 序列化,以及被 ObjectInputStream 反序列化。
Parcelable接口
Parcelable是Android为我们提供的序列化的接口,Parcelable相对于Serializable的使用相对复杂一些,但Parcelable的效率相对Serializable也高很多。
(3)序列化原理
(4)反序列化原理
(5)Parcelable
Parcel是什么?Parcel翻译过来是打包的意思,其实就是包装了我们需要传输的数据,然后在Binder中传输,也就是用于跨进程传输数据
简单来说,Parcel提供了一套机制,可以将序列化之后的数据写入到一个共享内存中,其他进程通过Parcel可以从这块共享内存中读出字节流,并反序列化成对象。
Parcel可以包含原始数据类型(用各种对应的方法写入,比如writeInt(),writeFloat()等),可以包含Parcelable对象,它还包含了一个活动的IBinder对象的引用,这个引用导致另一端接收到一个指向这个IBinder的代理IBinder。
Parcelable通过Parcel实现了read和write的方法,从而实现序列化和反序列化。