Unity学习----【数据持久化】二进制存储(一)
·来源于唐老狮的视频教学,仅作记录和感悟记录,方便日后复习或者查找
一.用二进制存储的好处
我们之前学习过用Json以及XML来存储数据,但是它们有两个缺点:
①过于显示化,容易被理解并修改,不够安全
②因为它们都是把数据转换成字符串之后读取,因此效率相对更低。
而二进制的存储方式正好能够避免以上的两个缺点,二进制数据机器可以快速地读取与存储;同时很难被一般人阅读并修改。


二.Unity中各个变量与二进制比特之间的转换
1.回顾变量与字节长度
首先我们需要回顾一下C#中有哪些变量类型
这些变量类型占的字节长度是不同的(一字节等于8比特)
2.字节与变量之间的转换API
这里的转换API我们通过一个静态公共类:BitConverter来实现
通过它我们可以把变量转换成字节数组,把字节属于组转换回变量
- BitConverter.GetBytes(256):是指传入一个值,并把它转换成相应的字节数组【一个字节是八个比特,每个比特是1或者0。而一个整形是4个字节,所以它转换的字节数组长度为4,bytes[0]表示0~8位的比特,bytes[1]表示9~16的比特,bytes[2]表示17~24的比特,bytes[3]表示25~36的比特。因此我们可以推断,256转化成的字节数组中元素是(0,1,0,0),因为0~8位比特刚好表示0~255的十进制数字,而第9位比特为1的时候刚好表示256 。】
- BitConverter.ToInt32(bytes,0):是传入一个字节数组,从第一个索引处开始解析,把他转化为整形数据。【这里从(0,1,0,0)的索引为0的位置处进行转化,可以得到256】
3.标准编码格式以及相关API
编码格式是指把字符变为相应的数字的一种规范。我们常见的编码格式有ASCII,UTF-8。
相关的API有
Encoding.UTF8.GetBytes("唐老狮"):是指以UTF-8的格式把这个字符编码为字节数组
Encoding.UTF8.GetString(bytes2):是指以UTF-8的格式来解析这个字节数组
三.Unity中的File相关的API
C#给我们提供了用于进行文件操作的相关API,可以帮助我们实现文件的创建,写入,读取,删除,复制,替换,打开等功能
1.判断文件是否存在
//1.判断文件是否存在if(File.Exists(Application.dataPath + "/UnityTeach.tang")){print("文件存在");}else{print("文件不存在");}
2.创建文件
//1.创建空文件
FileStream fs = File.Create(Application.dataPath + "/nanako0.nai");
①创建完文件之后它会以文件流的形式打开着,之后要对他进行写入操作的话需要先关闭
3.写入文件
//2.写入文件
byte[] bytes = BitConverter.GetBytes(256);
File.WriteAllBytes(Application.dataPath + "/nanako1.nai", bytes);string[] strs = new string[] {"我喜欢你", "我爱你", "我好想你", "我想见你" };
File.WriteAllLines(Application.dataPath + "/nanako2.nai", strs);string str = "我想抱住你\n想和你整天腻歪在一起";
File.WriteAllText(Application.dataPath + "/nanako3.nai", str);
创建之后刷新可以在Assets下看到它
4.读取文件
//3.读取文件
bytes = File.ReadAllBytes(Application.dataPath + "/nanako1.nai");
print(BitConverter.ToInt32(bytes, 0));strs = File.ReadAllLines(Application.dataPath + "/nanako2.nai");
foreach(string s in strs) {print(s);
}str = File.ReadAllText(Application.dataPath + "/nanako3.nai");
print(str);
5.删除文件
//4.删除文件
File.Delete(Application.dataPath + "/nanako0.nai");
①注意删除的时候需要保证文件处于关闭状态,否则会报错
6.复制文件
//5.复制文件File.Create(Application.dataPath + "/nanakoCopy.nai").Close();File.Copy(Application.dataPath + "/nanako2.nai", Application.dataPath + "/nanakoCopy.nai", true);
①这里复制文件的参数是(复制来源,复制目的地,是否覆盖)
②复制来源和复制目的地这两个位置都需要保证它们是存在,且没有被打开的
7.替换文件
//6.替换文件
File.Create(Application.dataPath + "/nanakoReplace.nai").Close();
File.Create(Application.dataPath + "/nanako备份.nai").Close();
File.Replace(Application.dataPath + "/nanako3.nai", Application.dataPath + "/nanakoReplace.nai", Application.dataPath + "/nanako备份.nai");
8.打开文件
//7.打开文件
FileStream fs2 = File.Open(Application.dataPath + "/nanako2.nai", FileMode.OpenOrCreate, FileAccess.ReadWrite);
①参数是(打开的路径,打开的模式【OpenOrCreate是指有就打开没有就创建】,打开后的访问模式【ReadWrite是指读或者写】)
②这里返回的变量类型是文件流FileStream,我们之后会更详细地介绍它
四.总结
①二进制存储相对Json和XML这些把数据转化为字符串来存储与读取的方式更加安全且高效
②变量是占不同字节数的,可以用API把它们转化为相应的字节数组,数组的长度等于变量占用的字节数(比如Int占四位,所以字节变量的长度是四位,一位字节对应八位比特)。同时也可以通过API把字节数组转化为相应的变量值
③对于字符变量的转化,我们在编码和解码的时候都需要给他指定相应的字符格式(一般我们都用UTF-8即可)
④对于文件的操作,我们可以进行创建,写入(二进制,字符串数组,字符串),读取(二进制,字符串数组,字符串),删除,复制,替换,打开等操作。其中注意进行上述操作最好都保证文件处于关闭的状态,创建出来的文件是处于打开的状态,可以用API来关闭它先。以及复制和替换这两个操作中涉及到的文件都要保证它们是存在的。