背景
正在完善的安卓日志工具,输出日志文件采用mmap方式输出,参考的biaoShow/TestDemoKotlin,映射不存在文件的时候没有问题。当原本存在一个文件,由于mmap要求4096整数倍为一页,文件大小原本上次映射时就有了一页大,但里面内容才几个字符,后面通过常规方式读取文件大小出来就是那个4096整数倍了,虽然也能追加写日志,但这样下去就浪费了太多空间。
解决思路
映射前先读取文件内容一次,读取失败就是不存在,成功就获取到了一个字符串,这个字符串长度就是实际内容大小。
至于获取文件大小,stat()、fstat()、lseek()等方式获取的确实是文件大小,但是里面内容是没填满的。
打个比方就是mmap映射按整桶来,每次装东西在桶里,重新映射的时候桶数(文件大小)没错,但里面有没装满的其实还能装,就需要得到实际装了多少才行。
代码
因为只需要会用,实现这个文件写入功能,我是根据参考代码来的:
extern "C"
jstring
Java_com_biao_testdemokotlin_Jni_read(JNIEnv *env, jobject clazz, jstring path) {
try {
std::string file_path = jstring2str(env, path);
// 打开文件
int fd = open(file_path.c_str(), O_RDONLY);