你真的知道 APP 缓存目录的内幕吗:大家开发 Android 的 APP 的时候,大都会用三方的图片加载框架吧,eg:Glide,Pacasio 等。
有时候配置这些图片加载框架的时候我们就需要自己写一个图片缓存的本地存储地址。在 Android 手机里面,存储的位置分为两类,一类是 Internal Storage,即内部存储,另外一类是 External Storage,即外部存储。
比较老的手机,有一个手机内部存储,还有一个 SD 卡存储,就是分别对应这两种存储位置,因为以前的 SD 卡是可以扩展的,即可拆卸的,所以可以用是否可拆卸作为内外存储的分类标准。
但是现在最新的设备,比如小米、锤子、华为等,都取消了可拆卸的 SD 卡,直接与机身焊接在一起,分为 16G、32G 版本,所以现在内外存储的分类不再以是否可拆卸作为标准,而是以下面的几方面作为新的标准:
首先我们分别介绍下 Android 中几种存储方式的不同之处和应用。
一、各自的存储特点 1. 内部存储总是可用的 这里的文件默认是只能被你的 app 所访问的 当用户卸载你的 app 的时候,系统会把 internal 里面的相关文件都清除干净 Internal 是在你想确保不被用户与其他 app 所访问的最佳存储区域。2. 外部存储并不总是可用的,因为用户可以选择把这部分作为 USB 存储模式,这样就不可以访问了。 是大家都可以访问的,因此保存到这里的文件是失去访问控制权限的。 当用户卸载你的 app 时,系统仅仅会删除 external 根目录(getExternalFilesDir())下的相关文件。 External 是在你不需要严格的访问权限并且你希望这些文件能够被其他 app 所共享或者是允许用户通过电脑访问时的最佳存储区域。二、文件位置和相关 API0. 检查介质可用性
在使用外部存储执行任何工作之前,应始终调用 getExternalStorageState() 以检查介质是否可用。介质可能已装载到计算机,处于缺失、只读或其他某种状态。 例如,以下是可用于检查可用性的几种方法:
- /* Checks if external storage is available for read and write */
- public boolean isExternalStorageWritable() {
- String state = Environment.getExternalStorageState();
- if (Environment.MEDIA_MOUNTED.equals(state)) {
- return true;
- }
- return false;
- }
- /* Checks if external storage is available to at least read */
- public boolean isExternalStorageReadable() {
- String state = Environment.getExternalStorageState();
- if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
- return true;
- }
- return false;
- }
1. 内部存储 getFileDir() 通过此方法可以获取到你的 APP 内部存储的文件,路径为 / data/data/pacgage_name/files getCacheDir() 通过此方法可以获取到你的 APP 内部存储的文件,路径为 / data/data/package_name/cache openFileOutput() 通过此方法,我们可以获取到一个输出流,输出流的保存路径是 / data/data/package_name/files ,和 getFileDir() 的路径一致 *2. 外部存储
2.1 私有存储
Context.getExternalCacheDir() Context.getExternalFilesDir()
创建的私有文件的地址是 / sdcard/Android/date/package_name 下面,Android 文件夹是隐藏文件夹,用户无法操作。
如果我们想缓存图片等比较耗空间的文件,推荐放在 getExternalCacheDir() 所在的文件下面,这个文件和 getCacheDir() 很像,都可以放缓存文件,在 APP 被卸载的时候,都会被系统删除,而且缓存的内容对其他 APP 是相对私有的。
2.2 公有存储
* Environment.getExternalStorageDirectory()
* Environment.getExternalStoragePublicDirectory()
你的 APP 产生的文件不需要隐藏,即对用户是可见的,那么你可以把文件放在外部的公共存储文件下面。这个方法不是 Context 的方法,而是 Environment 的两个方法,第一个方法获取到的其实是外部存储的根目录,而第二个方法获取到得则是外部存储的公共目录。其实在访问权限上是没有区别的,不同点是 getExternalStoragePublicDirectory() 在运行的时候,会需要你带有一个特定的参数来指定这些 public 的文件类型,以便于与其他 public 文件进行分类。
例如,以下方法在公共图片目录中创建了一个用于新相册的目录:
- public File getAlbumStorageDir(String albumName) { // Get the directory for the user's public pictures directory. File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file;}
4. 其他实用 APIgetFilesDir() 获取在其中存储内部文件的文件系统目录的绝对路径。 getDir() 在您的内部存储空间内创建(或打开现有的)目录。 deleteFile() 删除保存在内部存储的文件。 fileList() 返回您的应用当前保存的一系列文件。三、清除数据、清除缓存的区别
清除数据主要是清除用户配置,比如 SharedPreferences、数据库等等,这些数据都是在程序运行过程中保存的用户配置信息,清除数据后,下次进入程序就和第一次进入程序时一样。而缓存是程序运行时的临时存储空间,它可以存放从网络下载的临时图片,从用户的角度出发清除缓存对用户并没有太大的影响,但是清除缓存后用户再次使用该 APP 时,由于本地缓存已经被清理,所有的数据需要重新从网络上获取。为了在清除缓存的时候能够正常清除与应用相关的缓存,请将缓存文件存放在 getCacheDir() 或者 getExternalCacheDir() 路径下。
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: