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);

扫描二维码关注公众号,回复: 10686637 查看本文章

需要注意的是,Android上这两个路径都只能读,如果你需要修改某个文件,则需要将文件拷贝到SD卡中,再进行写的操作,可以参考:
Android复制asset目录的文件到SD卡下

参考

iOS 沙盒机制
iOS 沙盒目录结构及正确使用
Android 工程内嵌资源文件的两种方法

发布了42 篇原创文章 · 获赞 33 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/gaussrieman123/article/details/89467829