这周被一个问题给折腾了几个晚上,那就是在Android中读取文件,这本是一件很简单的事情,可想象总是美好的。
1.在电脑上读取文件
首先要解决的当然是在电脑上读取文件了,这个并不难,网上一堆资料。
比如:
-
[cce_cs]
public static string LoadFile(string filePath)
{
string url = Application.streamingAssetsPath + "/" + filePath;
return File.ReadAllText(url);
}
[/cce_cs]
文件必须放在Assets\StreamingAssets目录下(可以有子目录),否则移植到其他设备后,会无法读取文件的。
这个目录下的文件是只能读不能写的,我的目的也仅仅是读取文件。
Application.streamingAssetsPath会自动根据不同的平台返回该平台下对应的正确路径(Assets\StreamingAssets目录下的文件在不同平台里会保存到不同的路径,所以需要取出正确的路径)。
然后就是使用File.ReadAllText读取整个文件,保存为一个字符串对象。
2.在Android上读取文件
在电脑上读取文件很简单,毕竟资料多,而在Android上读取文件就很惨烈了。
也许大家关注的都是Ios吧,唯独我是优先关注Android的。
大家可以试试去搜索一下,基本上第一条搜到的就是宣雨松Momo的博客,他写的是【读写文件】的方式(是100%能成功的)。
但是那种方式需要在代码里创建文件,然后再读取文件,而我需要的是读取静态文件,也就是预先创建好的文件。
Momo估计也是比较专注于Ios的,所以他没有进行太多Android的测试。
其他搜索的文章也大多在说路径的问题(也就是我第一条标题里所说的内容)。
所以,我不得不发发牢骚,太神奇了,为什么会这么少人关注Android读取的问题呢?
难道这个在API文档里有写?(如果有,请告诉我,我没找到,不知道该用什么关键字)
好了,不唠叨了,少是少了点,但还是有资料提到这个问题的。
说解决方案,也确实很简单,在Android里读取文件,得用WWW来读取,如下代码:
-
[cce_cs]
public static string LoadFile(string filePath)
{
string url = Application.streamingAssetsPath + "/" + filePath;
#if UNITY_EDITOR
return File.ReadAllText(url);
#elif UNITY_ANDROID
WWW www = new WWW(url);
while (!www.isDone) { }
return www.text;
#endif
}
[/cce_cs]
理论上WWW是用来读取网络文件的,而Android上需要用这种方式来读取,让我觉得很奇怪。
也许有更好的方式?如果有,希望能和我分享一下。
3.结束
这里有个小地方要注意的,如果你希望把读取的文本按行分割,可以这么做:
return www.text.Split(new string[] { "\r\n" }, StringSplitOptions.None);
要用"\r\n"来分割,而不是"\n",否则会出现乱七八糟的怪问题(别问我是怎么知道的,心疼,不想提)。
好了,希望我这篇文章能帮到和我一样被这个问题折腾的人。
为了让更多人能够第一时间搜到我的文章,而不是那些无法对这个问题提供帮助的文章,我额外列一些关键字:
Unity 读取Android文件
Unity 读取安卓文件
The End。