当前位置: 首页 > news >正文

Unity学习----【数据持久化】二进制存储(一)

·来源于唐老狮的视频教学,仅作记录和感悟记录,方便日后复习或者查找


一.用二进制存储的好处

我们之前学习过用Json以及XML来存储数据,但是它们有两个缺点:

①过于显示化,容易被理解并修改,不够安全

②因为它们都是把数据转换成字符串之后读取,因此效率相对更低。

而二进制的存储方式正好能够避免以上的两个缺点,二进制数据机器可以快速地读取与存储;同时很难被一般人阅读并修改

一个整形520在二进制中的存储样式
二进制读取本质的更详细描述

二.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来关闭它先。以及复制替换这两个操作中涉及到的文件都要保证它们是存在的

http://www.dtcms.com/a/356344.html

相关文章:

  • ExcelJS实现导入转换HTML展示(附源码可直接使用)
  • Excel数组学习笔记
  • 在Excel和WPS表格中隔一行插入多个空白行
  • 网络编程 04:TCP连接,客户端与服务器的区别,实现 TCP 聊天及文件上传,Tomcat 的简单使用
  • 从零开始部署 Kubernetes Dashboard:可视化管理你的集群
  • [Linux]学习笔记系列 -- mm/shrinker.c 内核缓存收缩器(Kernel Cache Shrinker) 响应内存压力的回调机制
  • 创意程序之MP3分割工具
  • sqlachemy
  • AI操作系统语言模型设计 之1 基于意识的Face-Gate-Window的共轭路径的思维-认知-情感嵌套模型
  • 【C语言】深入理解指针(2)
  • 龙迅#LT7621GX适用于两路HDMI2.1/DP1.4A转HDMI2.1混切应用,分辨率高达8K60HZ!
  • 第二阶段WinForm-11:自定义控件
  • 嵌入式Linux驱动开发:i.MX6ULL中断处理
  • 深入解析Qt节点编辑器框架:交互逻辑与样式系统(二)
  • C++基础(⑤删除链表中的重复节点(链表 + 遍历))
  • 储能变流器之LLC
  • MySQL数据库精研之旅第十四期:索引的 “潜规则”(上)
  • Unity、Unreal Engine与Godot中纹理元数据管理的比较分析
  • 嵌入式Linux LED驱动开发
  • Ubuntu22.04系统安装Opencv,无法定位包libjasper-dev libdc1394-22-dev的解决办法
  • 【C++】C++入门——(上)
  • GTSAM中gtsam::LinearContainerFactor因子详解
  • 【C++八股文】计算机网络篇
  • 【YOLO学习笔记】数据增强mosaic、Mixup、透视放射变换
  • flutter-使用url_launcher打开链接/应用/短信/邮件和评分跳转等
  • leetcode 338 比特位计数
  • rockchip温控及cpu降频配置
  • 事务和锁(进阶)
  • 使用 Docker 部署 Squid 为 Kubernetes 中的 Nexus3 提供公网代理访问
  • Windows12概念曝光,巧用远程控制工具抢先体验