环境:Unity Android 9 C#
需求
实时存储数据,数据一直变动,就需要一直存
原因
安卓系统文件存储(File类)并不会直接存到磁盘里,而是有一个缓存区,缓存区在内存里,安卓系统认为是时候把缓存的数据存到磁盘里了,你才真正意义上保存完毕了。(Windows好像也是这样)
如果还没有存到磁盘里就断电了,那数据就没了。
Java可以手动清除缓存区,强制存到磁盘里。奈何我不会这个- -
不同设备好像需要不同适配,不是很确定。
纯C#的解决办法
根据需求,我开了一个线程
每0.1秒存储一个新的文件,文件名称格式:00000-000000。
前面五位数字是天数,后面的6位数字是序号,一天86400秒,最多就是864000个文件
后面每到864000,就归0,前面的天数+1,最大99999天可以支持程序运行273年。
超过还有天数归0功能,直接无敌
设置一个文件最大数量,300个,当超过这个数量时,删除最早存的那个。(好在我的文件只有1kb大小。)
在读取文件时获取名称的数值,并从最大数值的文件开始读取,直到读取到正确数据为止。
我使用的安卓盒子测试缓存时间,大概8~10秒才会存到磁盘里(简单测试,仅供参考,建议自己测一下)
另外安卓盒子断电后,系统时间会重置到上次开机的时间
在断电重启后,读取“未来时间”的存档文件会失败,把系统时间调整到文件时间之后正常。
盒子没联网,也就没法通过网络更新时间,所以在文件存储的时候把文件的时间修改掉,解决问题。
File.SetCreationTime("C:\\test.txt", DateTime.Now.AddYears(-1));
File.SetLastWriteTime("C:\\test.txt", DateTime.Now.AddYears(-2));
File.SetLastAccessTime("C:\\test.txt", DateTime.Now.AddYears(-3));
SetCreationTime 修改文件的创建时间
SetLastWriteTime 修改文件的修改时间
SetLastAccessTime 修改文件的访问时间
AddYears(-1)代表减一年。
File的命名空间:System.IO