我在应用程序中有一些可下载的内容(例如:游戏角色图像),在iOS中它们被保存到路径NSCachesDirectory,我遵循iOS的指导原则,可下载的内容应该保存在NSCachesDirectory中,这是一个缓存目录。如果我要将文件保存到android端的getCacheDir(),我很挣扎。
起初我认为iOS中的缓存文件夹应该与android中的缓存文件夹相同(或类似),但在查看某些文档后,我怀疑它们在功能上是否相同:
1.iOS建议将一些可下载的内容保存在缓存文件夹中,这样的内容在tmp中更加持久化临时文件。但是在android中,doc说getCacheDir()应该存储缓存文件而不是persist文件,这让我怀疑android缓存文件夹更像iOS中的tmp文件夹2.我在iOS缓存文件上找不到任何大小限制指南,但是android方面说它应该有合理的大小限制,比如1 MB(我认为我的内容将远远超过1 MB,比如50到100 MB )。
所以我的问题是,iOS缓存文件夹在功能上与android中的缓存文件夹相同吗?在iOS端使用NSCachesDirectory的地方在android端使用getCacheDir()是否正确?如果没有,当我在iOS端使用NSCachesDirectory时,我应该在android端使用哪条路径?
答案 0 :(得分:4)
不,iOS缓存文件夹在功能上与缓存无关 android中的文件夹。
有关Android所有数据存储选项的详细信息,请查看official docs here。
在用于存储大量数据的Android中,您可以使用内部或外部数据存储选项。如果需要,您还可以在内部或外部数据存储选项上将数据设为私有。
内部存储空间
每个应用程序都有自己的私有内部存储来保存文件。如果用户不能从应用程序外部修改文件,并且其他应用程序无法访问这些文件,则可以使用此类存储。由于内部存储对您的应用程序是私有的,因此如果卸载了您的应用程序,则会删除这些文件。内部存储也是默认情况下安装应用程序的位置,因此您的文件始终可用。在一些较旧或较便宜的设备上,内部存储非常有限,因此如果您需要支持这些设备,则需要注意保存的数据大小。
您永远不应该硬编码存储目录的路径,因为目录可能会根据所使用的Android操作系统的版本而改变。此外,Android 4.4引入了多个用户的概念:在这种情况下,内部和外部存储依赖于登录的用户,其他用户的文件将是不可见的。以下是用于获取内部存储路径的一些方法:
android.content.Context.getFilesDir():从当前上下文返回一个java.io.File对象,表示应用程序内部存储的根目录。
android.content.Context.getDir(String name,Context.MODE_PRIVATE):返回一个java.io.File对象,表示内部存储中的目录名,创建目录if它不存在。第二个参数也可用于将目录设置为MODE_WORLD_READABLE或MODE_WORLD_WRITABLE,以便所有其他应用程序都可以看到它,但这在安全方面存在风险,在API级别17(Android 4.2)中已弃用。
< / LI>android.content.Context.getCacheDir():返回一个java.io.File对象,表示应用程序的内部缓存目录。这意味着小文件(文档建议不超过1MB)可以在系统需要更多存储时随时删除。无法保证缓存将被清除,因此您还必须在不再需要时手动清除这些文件。
如您所见,文件由来自java.io名称空间的File对象表示:没有特定于Android SDK的文件对象,并且使用了用于读取和写入文件的标准Java API。此外,没有特定的应用程序权限在Android清单中设置使用内部存储,因为它已经是应用程序的私有。
外部存储空间
除了内部存储之外,还有一个外部存储空间,由卸载应用程序时保留的所有应用程序共享。这是使用文件资源管理器应用程序时以及将设备插入计算机时显示的存储。它可以实现为可以删除的SD卡,也可以实现为设备中内置存储的分区,因此即使删除或更改了卡,您的应用程序也应该能够正常工作。要检查外部存储的当前状态,可以调用getExternalStorageState()方法。
在具有许多用户的设备上(从Android 4.4开始),外部存储特定于当前用户,并且无法访问其他用户的文件。此外,如果设备具有内置外部存储器(内部存储器和SD卡上的分区),则可能存在多个外部存储器:在这种情况下,内置存储器是主要外部存储器。从外部存储中读取文件需要READ_EXTERNAL_STORAGE权限,写入或读取文件需要WRITE_EXTERNAL_STORAGE权限。
以下是您应该使用的方法来获取主外部存储的目录: