2016-05-27 60 views
1

我在应用程序中有一些可下载的内容(例如游戏角色图像),在iOS中它们被保存到路径NSCachesDirectory,我遵循iOS的准则,可下载内容应该保存在NSCachesDirectory(缓存目录)中。如果我应该将文件保存到android端的getCacheDir(),我挣扎。android(getCacheDir())中的缓存文件夹在功能上等同于iOS中的缓存文件夹(NSCachesDirectory)吗?

起初我觉得在iOS上的缓存文件夹应该等于(或类似)的一个android的,但看一些文档后,如果他们的功能相同,我怀疑:

1.iOS提出了一些可下载内容保存在缓存文件夹中,这样的内容更加坚持tmp中的临时文件。但在android中,文档说getCacheDir()应该存储缓存文件而不是持久文件,这让我怀疑android缓存文件夹的工作方式与iOS中的tmp文件夹更像是相似的

2.我在iOS缓存中找不到任何大小限制指南文件,但android方面表示它应该有合理的大小限制,比如1 MB(我认为我的内容将远远超过1 MB,比如说50到100 MB)。

所以我的问题是,iOS缓存文件夹的作品在功能上等同于android中的缓存文件夹?在iOS端使用NSCachesDirectory的地方在android端使用getCacheDir()是否正确?如果不是,当我在iOS端使用NSCachesDirectory时应该在android端使用哪个路径?

回答

3

不,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对象,表示内部存储器中的目录名称,如果该目录不存在,则创建该目录。第二个参数也可用于将目录设置为MODE_WORLD_READABLE或MODE_WORLD_WRITABLE,以便所有其他应用程序都可以看到该目录,但这样做在安全性方面存在风险,并且在API级别17(Android 4.2)中不推荐使用。

  • android.content.Context.getCacheDir():返回表示应用程序的内部缓存目录的java.io.File对象。这对于小文件(文档建议不要超过1MB)可以在系统需要更多存储空间时随时删除。无法保证缓存将被清除,因此您必须在不再需要时手动清除这些文件。

正如你可以看到,这些文件从java.io namepace 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():返回表示特定于应用程序的主外部存储,它是()由getExternalStorageDirectory返回的目录下的根目录下的的java.io.File。与外部存储的其他目录不同,当您的应用程序被卸载时,您存储在该文件夹中的文件将被删除。所以,如果你需要存储只有你的应用程序需要的文件,你应该使用这个文件夹。此外,从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权限。
+0

有关android文件系统的最佳解释。谢谢 – netsmertia

相关问题