【问题标题】:Is cache folder in android (getCacheDir()) functionally equivalent to cache folder in iOS (NSCachesDirectory)?android (getCacheDir()) 中的缓存文件夹在功能上是否等同于 iOS (NSCachesDirectory) 中的缓存文件夹?
【发布时间】:2016-09-25 09:57:50
【问题描述】:

我在应用程序中有一些可下载的内容(例如:游戏角色图像),在 iOS 中它们保存到路径 NSCachesDirectory,我遵循 iOS 的指导方针,即可下载内容应保存在 NSCachesDirectory 中,这是一个缓存目录。如果我应该将文件保存到 android 端的 getCacheDir(),我正在苦苦挣扎。

起初我认为 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端使用哪个路径?

【问题讨论】:

    标签: android ios caching storage icloud


    【解决方案1】:

    不,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 命名空间中的 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_MUSIC) 获取公共音乐目录的路径,或通过调用 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) 获取公共图片目录。
    • 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 权限。

    【讨论】:

    • 关于 android 文件系统的最佳解释。谢谢
    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2016-02-07
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多