android中的缓存文件夹(getCacheDir())在功能上等同于iOS中的缓存文件夹(NSCachesDirectory)吗?

时间:2016-05-27 07:13:23

标签: android ios caching storage icloud

我在应用程序中有一些可下载的内容(例如:游戏角色图像),在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端使用哪条路径?

1 个答案:

答案 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权限。

以下是您应该使用的方法来获取主外部存储的目录:

  • android.os.Environment.getExternalStorageDirectory():返回一个java.io.File对象,该对象表示所有应用程序共享的设备主外部存储的根目录。
  • android.os.Environment.getExternalStoragePublicDirectory():返回一个java.io.File对象,表示设备主外部存储器上特定类型文件的公共目录。例如,您可以通过调用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)调用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)或公共图片目录来获取公共音乐目录的路径。
  • android.content.Context.getExternalFilesDir():返回一个java.io.File,表示特定于您的应用程序的主外部存储的根目录,该目录位于getExternalStorageDirectory返回的目录下( )。与外部存储的其他目录不同,卸载应用程序时将删除存储在该文件夹中的文件。因此,如果您需要存储应用程序仅需要的文件,则应使用此文件夹。此外,从Android 4.4开始,应用程序无需读取或写入自己的外部存储,但是对于旧版本,您的应用程序需要READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限。
  • android.content.Context.getExternalFilesDirs():返回一个java.io.File数组,表示应用程序可以使用主外部存储的所有外部存储目录的根目录存储作为数组中的第一个目录。所有这些目录的工作方式与getExternalFilesDir()方法返回的主存储相同。如果设备具有内置存储作为主外部存储,SD卡作为辅助外部存储,则这是获取SD卡路径的唯一方法。 Android 4.4中引入了此方法,之前无法获取辅助存储的路径。
  • android.content.Context.getExternalCacheDir():返回一个java.io.File对象,表示主外部存储上应用程序的缓存。此缓存对用户不可见,并在卸载应用程序时删除。 Android SDK中没有删除缓存目录中文件的机制,因此您需要管理缓存以使其保持合理的最大大小。从Android 4.4开始,应用程序不需要访问自己的缓存的权限,但对于旧版本,您的应用程序需要READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限。