Android与iOS资源文件读写对比
在开发中,算法配置文件是作为独立资源文件存在,初始化的时候读取到应用中,因此有必要对Android和iOS系统下的资源文件读写有一定的了解。
首先要搞清楚的一点是,我们在PC上开发时使用的所有资源,移动端是没有办法直接使用的,移动端只能对它本地的资源进行读写,不能凭空直接访问PC端的资源。所以我们要再移动端访问资源文件,涉及到两个问题,一是资源的传递,二是移动端资源的读写。
总体来说,两个系统对资源文件都有比较严格的权限限制,需要在特定的文件夹下进行读和写。iOS有独特的应用沙盒来保证读写操作;Android提供res/raw和assets两种方式来读,写文件则必须在sd卡中进行。
iOS应用文件结构
每个app都是一个沙盒,每个应用都只能访问当前沙盒目录下面的文件(也有例外,比如在用户授权情况下访问通讯录,相册等),这个规则展示了iOS系统的封闭性。
文件夹
- Documents 目录:您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据。该路径可通过配置实现iTunes共享文件。可被iTunes备份。
- AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。
- Library 目录:这个目录下有两个子目录:
Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.
Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。
可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份。
- tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。该路径下的文件不会被iTunes备份。
获取各个文件夹的方式
- 通过系统API逐个获取:
// 获取沙盒主目录路径
NSString *homeDir = NSHomeDirectory();
// 获取Documents目录路径NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
// 获取Library的目录路径NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
// 获取Caches目录路径NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
// 获取tmp目录路径NSString *tmpDir = NSTemporaryDirectory();
- 通过NSString构造路径
在获取到主目录路径后,可以通过在主路径后面append各个文件夹路径来访问各个文件夹,比如
NSString *documentAssetFolderPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]
传递资源文件
在知道怎么获取资源文件后,还需要知道在开发过程中如何将图片文本等文件作为资源文件传给iOS应用,具体做法是在Xcode应用中选择
- Add files to “***”
- 在弹出框中勾选目标文件夹,在下面Added folders中勾选
Create folder references
可以看到在工程中,文件夹是蓝色的,就成功了。蓝色文件夹与黄色文件夹的区别可以参考:
https://www.jianshu.com/p/d32ef81c83c7
Android应用资源文件处理
Android上的资源文件可以分为两大类,一类是可以通过R类访问,这类资源放在res/下,按类别存放和访问,比如R.string.hello,string是类,hello是ID。但是我们这里说的是原始文件的读写,不能直接使用R类访问,这种资源在Android上也有两种处理方法:
- 保存在assets文件夹
保存在 assets/ 目录中的文件没有资源 ID,因此您无法通过 R 类或在 XML 资源中引用它们。您可以改为采用类似普通文件系统的方式查询 assets/ 目录中的文件,并利用 AssetManager 读取原始数据.
AssetManager am = context.getAssets();
InputStream is = am.open(cwj.dat);
- 保存在res/raw文件夹
利用 openRawResource() 读取字节流,比如hello.dat一个二进制文件,我们可以读取可以直接
InputStream is=context.getResources().openRawResource(R.raw.hello);
需要注意的是,Android上这两个路径都只能读,如果你需要修改某个文件,则需要将文件拷贝到SD卡中,再进行写的操作,可以参考:
Android复制asset目录的文件到SD卡下