getcachedir和getexternalcachedir的区别

本文介绍了Android应用中不同类型的文件存储位置,包括缓存文件、应用私有文件等,并详细解释了getCacheDir()、getFilesDir()等方法的作用及应用场景。此外,还提供了一段示例代码用于获取最佳的缓存文件存储路径。

getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()区,有需要的朋友可以参考下。

getCacheDir()方法用于获取/data/data/<application package>/cache目录

getFilesDir()方法用于获取/data/data/<application package>/files目录

 

应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。
大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。
这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据。
如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢?
通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。

而且上面二个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项

如果要保存下载的内容,就不要放在以上目录下

 较优秀的程序都会专门写一个方法来获取缓存地址,如下所示:

publicStringgetDiskCacheDir(Contextcontext){
StringcachePath = null;
//Environment.getExtemalStorageState() 获取SDcard的状态 

//Environment.MEDIA_MOUNTED 手机装有SDCard,并且可以进行读写


if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
||!Environment.isExternalStorageRemovable()){
cachePath=context.getExternalCacheDir().getPath();
}else{
cachePath=context.getCacheDir().getPath();
}
returncachePath;
}

 

可以看到,当SD卡存在或者SD卡不可被移除的时候,就调用getExternalCacheDir()方法来获取缓存路径,否则就调用getCacheDir()方法来获取缓存路径。前者获取到的就是/sdcard/Android/data/<application package>/cache 这个路径,而后者获取到的是 /data/data/<application package>/cache 这个路径。

文件的新建和读写:

File saveFile=new File("/sdcard/zhzhg.txt");
或:File sdCardDir=new File("/sdcard");//获取SD卡目录
File saveFile=new File(sdCardDir,"zhzhg.txt");
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("文件的读写".getBytes());
outStream.close();

android 获取系统默认路径

Environment.getDataDirectory().getPath(): /data
Environment.getDownloadCacheDirectory().getPath()  : /cache
Environment.getExternalStorageDirectory().getPath(): /mnt/sdcard
Environment.getRootDirectory().getPath()           : /system
Context.getCacheDir().getPath()                    : /data/data/com.zhd/cache
Context.getExternalCacheDir().getPath()            : /mnt/sdcard/Android/data/com.zhd/cache
Context.getFilesDir().getPath()                    : /data/data/com.zhd/files
Context.getObbDir().getPath()                      : /mnt/sdcard/Android/obb/com.zhd
Context.getPackageName()                           : com.zhd
Context.getPackageCodePath()                       : /data/app/com.zhd-1.apk
Context.getPackageResourcePath()                   : /data/app/com.zhd-1.apk

 

 

 

 

 

### 获取应用缓存路径 在 Android 应用中,可以通过 `Context.getCacheDir()` 方法获取内部存储中的缓存目录。该目录通常位于 `/data/data/<package_name>/cache`,系统会自动管理此目录下的文件,并在设备存储空间不足时优先清理这些缓存文件[^1]。 对于外部存储中的缓存目录,可以使用 `Context.getExternalCacheDir()` 方法获取。该目录通常位于 `/storage/emulated/0/Android/data/<package_name>/cache`,适用于需要更大缓存空间或用户主动选择将缓存保存到外部存储的场景[^2]。 ### 计算缓存大小 为了获取当前应用缓存的总大小,需要递归遍历缓存目录及其子目录,并累加所有文件的大小。以下是一个实现示例: ```java public static long getFolderSize(File file) { long size = 0; if (file != null && file.exists()) { File[] files = file.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { size += getFolderSize(f); } else { size += f.length(); } } } } return size; } ``` 调用方式如下: ```java File cacheDir = context.getCacheDir(); long cacheSize = getFolderSize(cacheDir); ``` 如果需要同时统计外部缓存目录的大小,只需将 `context.getExternalCacheDir()` 作为参数传入即可[^3]。 ### 清除应用缓存 清除缓存的操作同样是递归删除缓存目录下的所有文件子目录。以下是一个实现方法: ```java public static void clearCache(File dir) { if (dir != null && dir.exists() && dir.isDirectory()) { File[] children = dir.listFiles(); if (children != null) { for (File child : children) { if (child.isDirectory()) { clearCache(child); } child.delete(); } } } } ``` 调用方式如下: ```java clearCache(context.getCacheDir()); clearCache(context.getExternalCacheDir()); ``` 上述方法会立即删除缓存文件,但需要注意的是,在执行删除操作前应确保应用没有正在使用的文件流,否则可能导致异常或数据丢失[^2]。 ### 缓存管理的最佳实践 - **异步处理**:由于缓存计算删除操作可能涉及大量 I/O 操作,建议在后台线程中执行,避免阻塞主线程导致 ANR。 - **权限检查**:在访问外部存储目录时,需动态申请 `READ_EXTERNAL_STORAGE` `WRITE_EXTERNAL_STORAGE` 权限(针对 Android 6.0 及以上版本)。 - **用户体验优化**:可以在设置界面提供“清除缓存”按钮,并在操作完成后提示用户当前缓存已清空或更新后的缓存大小[^3]。 通过上述方法,开发者可以有效地实现 Android 应用中缓存的获取与清除功能,提升应用性能用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值