原理:实际是调用系统内核的函数库,进行数据同步后,由内核将数据写入磁盘;
4K数据为一页,一页数据是IO操作的基本单位;
在空间局部性原理下,为了优化,如果数据量较大的情况下,可能会出现预占位4~16K的情况;实际还没写数据,只是提前先多开辟空间,减少了多次开辟空间的操作;
FileInputSteam inputSteam/FileOutSteam outSteam:
并没有实现inputSteam.flush(), 实际每次调用inputSteam.write()都会同步写数据;
java自己缓冲区默认大小为8K;
FileInputSteam inputSteam/FileOutSteam outSteam
BufferedOutputStream(outSteam) bos/BufferedIntputStream(inputSteam) bis:
在没有主动调用bosflush()时,每次调用bos.write(),而数据没写满缓存(8K),并不会将数据同步写入文件中;
只有写满缓存8K或者主动调用bos.flush()才会同步将数据写入文件;
后面讲;
作用:断点续传、大数据分析;
属于基础流,每次write就会写数据;
提供了定位处理,可以移动起始位置和设置读取偏移量;
如seek(10):从第10位开始;
配合MappedByteBuffer:读写一体的缓冲区,用到了映射,读写大文件时理论速度比普通buffer快3倍;
由于基础IO的相关处理方案,每一次写入都会直接调用复制(比较频繁),将用户空间的数据复制到内核空间,性能不高;
所以有了缓冲区,在当前用户空间,将数据缓存起来,到达8k时一次性写入或读出;
读数据时:
在应用层调用内核函数后,如果内核没准备好数据,则应用层会阻塞,等内核准备好数据后,内核进行复制数据操作,处理完返回状态值;
应用层隔断时间查询内核准备好数据没,不等待,查询到准备好时,内核进行复制数据操作,处理完返回状态值;
应用层找了个中间层,让中间人查询准备没,查询到准备好,通知应用层,内核进行复制数据操作,处理完返回状态值;
应用层和内核层建立链接,内核准备好后,通知应用层,内核进行复制数据操作,处理完返回状态值;
应用层和内核层建立链接,内核准备好后,直接将数据进行复制,处理完返回状态值;
专门针对网络使用的。是Okhttp内部的IO实现;
将普通的读/写IO的Buffer, 合并为一个双向链表,可以用来从头读,从尾部写;节省了两次开辟IO的Buffer;
用来做版本管理;
当对象读写时,和当前版本不一样时(如增加减少字段),会报错;
建议自己写一个版本号;也可以不写,不写时会自动生成;
被trasient修饰的变量不参与序列化;
整个对象序列化后,再反序列化后,读取被trasient修饰的变量值是null;
实现序列化的对象Person有一个User变量(没有用trasient),构造中传入一个未实现序列化的对象User,会报错;
没有;子类在继承父类时,将序列化权限也继承了;
若不想子类实现序列化,需重新一下任意一个方法:
java->.class->.dex->Apk;
按照固定的逻辑算法将文件的二进制数据进行重新打乱排序;
解密时,按照规定的逻辑反向恢复原有的二进制数据;
注意:其中加密算法,最好用c、c++写,打包成so库;因为我们的Application所在的包是没有被加密的,容易被破解;