刚刚进公司工作,遇到的第一个问题就是读取一个未知文件的数据,刚开始无从下手,后来在公司前辈的指导下才慢慢了解如何读取一个未知的文件数据。
当时使用BinaryReader(二进制)读取文件的,用二进制存储信息可以很好的保密数据,不知道编码的格式和顺序是很难导出其中的数据的,废话不多说,先用BinaryWrite写一个数据文件。
假设我们要存取一个游戏角色的基本信息hp、mp、attack、def和playername(随便写的几个数据),首先建一个unity的工程,写一个FileTest的类,加入using System将这几个数据定义在里面作为成员变量:
接着做下单例:
下面就是设置成员变量值了,因为只是做示范,所以我把所有的都写在一起了
然后就是写入数据了,先上代码:
在FileStream前面用using关键字并将内容写在一起就不用再手动去关闭流文件了,用的是OpenOrCreate的模式就不用担心没有文件的问题(如果没有就会自动创建),然后将从路径获取的流文件传给BinaryWriter,来创建br,Write()方法会识别参数类型,将其数据以二进制方法保存到文件中,同时将该流的当前位置(写数据的指针指向的当前写到数据的位置)偏移相应长度(例如int32是4字节,写完该数据后就会偏移4个字节),这样的好处就是你只有既知道编码的数据类型,又知道编码的顺序才能获取我的存储的数据,我们随便写几个数据试一下,创建一个MyRun.cs的类,设置几个数据值,将路径设置在该工程下的res文件夹内,此时文件夹内容为空:
MyRun.cs内容:
在场景中创建一个空物体,挂载MyRun.cs脚本,运行:
然后就会生成freestyle.fsl文件(可能不会立马在工程中显示,可以打开根目录应该是可以看得见的),这个文件一般的软件都打不开,即使用Notepad++打开,也是很难看的出来具体数据,保密性还是可以的。
下面就是如何读取这些数据了,毕竟存进去了,我肯定要读出来啊,不然怎么用!
首先还是回到FileTest这个类里,再接着写读取的方法,也是先上代码:
刚刚也说过了,读取的前提是知道编码数据的类型和顺序,我们编码的时候也知道,前四个是int数据,对应的是hp、mp、attack、def,第五个数据是playname,对应的是string,所以我们按这个顺序读取就好啦,是不是很简单啊,同样也是在MyRun.cs中加入ReadFile()方法,由于数据之前已经写入文档了,可以将其注释掉:
保存,运行,结果输出如下:
惊不惊喜,意不意外,全部读取出来了!!!