U3DC.COM | 优三帝研究院

Menu

unity数据管理之:txt,xml,json文件的读写

一、关于txt纯文本的读写
其实.txt,.xml,.json这类文件都属于文本文件,类似的还有.lrc歌词文件,.ini配置文件,.reg注册表文件等等,这类文件所储存的内容都是文本,只是各自有它们自己的格式,便于某些时候专用识别,所以读取txt文本是最基础的文本解析。

静态内部读取txt文本:
这是最简单的方式,建立TextAsset,直接把文本文件拖上去,就可以用了,
public TextAsset TxtFile;
print(TxtFile.text);
这是直接获取文本,也就是string类型的字符串。
要注意的是txt文本的编码格式,要改为UTF-8格式,否则读不出来,虽然不会报错。

动态内部读取文本:
把txt文件放在resources文件夹,利用Resources.Load加载
上面两种方式的代码:

外部读取文本:
实际运用中上述的两种方法使用的并不多,大多都是用的外部读取,比如解析某文本并在屏幕显示。
外部读取文本需要导入System.IO类,主要使用这个类的File类,具体API请查CSDN,这里只是简单的调用读取。要注意的是平台在PC。
我写了个方法,通过传递参数能获取文本的第几行内容

这个函数第一个参数是txt的路径名,第二个参数是第几行,0的话返回“”;File.ReadAllLines()方法就是按路径读取txt文本的内容,返回值是sring[]数组,元素是每行内容。这个是很简单的。类似的
File.ReadLines(filepath)是按行读取,每次只取一行,也比较常用。
关于路径又有绝对路径和相对路径,绝对路径就不解释了,就是这种"D:/MyTest.txt",相对路径要注意下,如果用Application.dataPath除了要注意移动平台之外,特别要注意Application.dataPath在编辑环境下和在生成exe之后是不一样的,编辑状态下,返回的是Asset位置,生成后Assets不再存在,返回位置是_Data文件夹,所以如果你想加载exe所在位置的txt文本,要先对Application.dataPath进行处理:

这个方法能在编辑状态下输出和Asset文件夹同目录的路径,和生成exe同目录的路径,如下面2张图中的MyTest文本的读取都可用上面这一套代码。

上面说的这四种方式的代码:

Txt文本的写入:
要给txt写入文本可以File.WriteAllLines(FileName,str);
要修改某行内容,我写了个简单的函数

传入参数,txt路径,哪一行,修改成的string
大家可以完善一下,我这是知道行数的情况,超出行数的情况大家自己想想怎么改。
Txt文本文件的创建:
创建文本很简单:File.CreateText(fileName),只有一个路径参数,可以先获取路径,再判断是否存在if(!File.Exists(fileName)){
files = File.CreateText(fileName);
}
OK,关于纯文本的读写以及创建,就写这么多了,感觉够详细了,新手也能看懂了吧,大家可以通过创建,读写来运用文本记录数据。

二、关于XML的读写,
关于XML相信大家是用得最多的了,这是一种标记语言,说得简单点就是有标记的文本,通过这些标记让我们快速查找,修改,替换等操作,容易操作是xml的优势,同样也是先导入using System.Xml;我们主要用这个类的XmlDocument类,我自己随便写了个xml,内容如下:

很简单,就4个主节点,每个节点下面有3个子节点,下面我们来读取这个xml的内容

上面我用的是绝对路径,相对路径请看上面的txt内容,通过GetElementsByTagName直接获取节点,返回类型是XmlNodeList数组,这个数组就包括了这个节点的所有内容,上面这个是输出”Mao_001”这个节点(第一个)的子节点的内容,输出为

注意这个[0].ChildNodes[i].InnerText,第一个0是数组的第一个元素,也就是找到的第一个”Mao_001”,后面的i是它的第几个子节点,InnerText是指这个节点下的内容,如果改为Name就是这个节点的名字,自己可以输出一下试试。如果要输出同一个名字的多个节点,可以这样

这是输出所有”Mao_001”节点下的内容。

 

XML的写入也同样简单XmlDocument.CreateElement就是写入节点的方法,另外RemoveChild移除某节点,ReplaceChild替换子节点,具体的其他方法各位可以查看MSDN~只是我们用xml一般是用来保存有规律的大量数据,以读为主,先把读数据搞明白吧。

三、关于JSON的读写
.json文件是一种轻量级的数据交换格式,它比纯文本多了一些格式,比XML又少了一些标记,看起来就像数组和哈希表的结合,结构非常简洁,大多用于网络传输,当然本地用来存储数据也是可以的,同样的,先using LitJson;这个类是在LitJson.dll中的,所以还要提前导入这个外部类,我们用它来解析json,LitJson.dll自己去下载个就行,解析json也不难

这是我解析某个json所写的函数,路径和上面说的那些一样,主要是通过JsonMapper.ToObject(str)来将字符串转换为我们要解析的JsonData,有了JsonData就可以按上面直接去数据用了,这里加载json数据用的是StreamReader,这是通过路径读取文本的,可以和前面说的读取文本一样使用,另外注意是传入的参数是字符串。。。所以原理上,我们可以把txt文本改为json格式,读取数据后传入同样能用~~所以不一定非要.Json格式文件,再说网络上传输给你的也是字符串,这个json要注意的是,利用www外部加载进来的json数据,通过JsonMapper.ToObject不能转换成JsonData,原因应该是编码的不同,www加载进来后编码换了,就不能读了,具体如何利用www来读json还需进一步探究。

四。、外部文件和文件夹的创建
外部文件的创建在前天提到了一点,创建文本,创建其它文件同样利用File类,用File.Create(path))方法只要改后缀名就可以创建其它文件,比如json,xml等,对于我们来说只有代码创建文本类文件才有意义,因为你用代码怎么也不能描述一张图一首音乐的~用unity创建文件夹:
创建文件夹用的是System.IO下的CreateDirectory,比如利用unity的截屏功能时,我们希望在软件同目录下有一个文件夹,专门来存储截图,这是就可以用动态创建文件夹来实现了,先判断是否已有文件夹,再决定是否创建

这个是比较实用的功能,截图自动保存,文件夹的位置和名字及图片文件的名字,自己写过函数来动态命名。

OK,就这些内容,后面写的有点乱,困了。。。希望对大家有用,如有错误和建议请指出,谢谢!

 

补充:

如果不用assetsbundle,发布时是没法自动把不在resources文件夹里的文档包括进去的,同时在发布后是无法对resources里面的东西进行更改的,也就是说没法实现写入。

解决方法是把必须要发布的文件放在resources里面,第一次启动的时候,把resources里面的东西读取进内存,然后存储到自己想要存的文件夹里面去。然后用destroy(_obj,true)来直接删除掉resource里面的这个文档资源(也可以留着不删)

在移动平台上发布后,ios wp这两个平台对文件夹的读写权限是有严格限制的。因此application.datapath是无法支持写入的。这个时候要换用application.persistentdatapath,才有写入的权限。只要用户不卸载这个应用,这个文件夹是不会被删除或者更改的(包括更新应用,也不会去更改这个文件夹)。

ios上面我还没测试,不过wp平台下directory是没法用的。要自己写插件,用windowsstorage来创建文件夹。

还有一点如果只是读取一些小型的xml文件,xmlserializer更好用一些,而且wp平台上不支持xmldocument类……xmlserializer在这些平台上都能运行良好……

 

打赏
— 于 共写了3373个字
— 文内使用到的标签:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据