mmap 的作用是,能将一个文件映射到内存中,你可以像操作内存(Buffer)一样读写文件内容
为什么要使用 mmap
mmap 能加快文件的读写速度,因为它是直接被映射在内存中的,目前腾讯的 MMKV 就是使用了mmap,使其的读写速度非常快
java 中使用 mmap 的类是 MappedByteBuffer
FileChannel fileChannel = new RandomAccessFile(new File("file"), "rw").getChannel();
MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, filechannel.size();
MappedByteBuffer
提供了 put
position
get
方法操作 Buffer 中的内存
这个内存会被系统在合适的实际写入到文件中
mmap 是否足够安全
mmap 采用内存映射,操作 mmap 内存时,是由操作系统负责写入的
所以操作完内存后,如果app 异常退出,或者被杀死,数据都不会丢失
如果操作系统突然断电则可能丢失数据
当然出于性能考虑,对突然断电导致的丢失可以忽略
mmap 在Android中的应用范围
- 日志
- 配置
日志和配置是经常访问的文件
对于日志:
如果采用同步写入日志方式,则对性能影响极大。一次文件写入虽然低至 1-2ms,但仍旧会造成性能问题。异步写入则可能app出错或杀死,导致日志丢失,此时使用 mmap 写日志可以在性能和日志安全中取一个平衡
对于配置
配置是经常读取,又需要长久保存的数据,使用mmap 最合适不过