首先我们要弄清楚几个概念:
getCacheDir()----------------------->/data/data/<application package>/cache/
getFilesDir()----------------------->/data/data/<application package>/files/
一般来说,上面这两个目录是用户不可见的,属于应用内部,比如WebView等一些缓存就存放于getCacheDir()。
===============================我是分割线=====================
而下面这两个目录则是用户可见的,并且当你的应用被卸载之后,“SDCard/Android/data/你的应用的包名/”这个目录下所有文件都会被删除。而且下面二个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项(有些机型清除数据的时候也会清除缓存,也就是说,有些机型清除数据就直接删除“SDCard/Android/data/你的应用的包名/”这个目录了。),如果要保存下载的内容,就不要放在以下两个目录里。而安卓6.0以后,新特性导致Uri.from(file)不再奏效,我们也可以把Provider映射到“Android/data/包名/”目录下,对应代码里的”SDCard/Android/data/包名/目录。
getExternalFilesDir()--------------->SDCard/Android/data/包名/files/
getExternalCacheDir()--------------->SDCard/Android/data/包名/cache/
计算缓存(部分代码):
format = new DecimalFormat("######0.00");//保留两位小数
tv_cache = (TextView) findViewById(R.id.tv_cache);
tv_cache.setOnClickListener(this);
// 刚好,我们指定的缓存目录和安卓getExternalCacheDir()是同一个地方,如果我们在Constants里指定的缓存目录
// 是别的目录,则可能还要把那个目录算进去(如果是需要删除的缓存的话)。这里我们算一次就行了。
long externalCacheSize = FileTool.calculateCacheSize(getExternalCacheDir());
long internalCacheSize = FileTool.calculateCacheSize(getCacheDir());
double totalCacheSize = ((double)(externalCacheSize + internalCacheSize)) / 1024 / 1024;
tv_cache.setText(format.format(totalCacheSize) + "MB");
/**
* 计算缓存大小
* @param targetFile 目标文件夹
* @return 本应用的磁盘缓存大小(单位:bit)
*/
public static long calculateCacheSize(File targetFile) {
long size = 0;
File[] files = targetFile.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
size += calculateCacheSize(file);
} else {
size += file.length();
}
}
}
return size;
}
删除缓存:
FileTool.deletePacketsByDirectory(getExternalCacheDir());
FileTool.deletePacketsByDirectory(getCacheDir());
/**
* 删除某文件夹下面所有的文件
*
* @param rootFile 根目录
*/
public static boolean deletePacketsByDirectory(File rootFile) {
File[] files = rootFile.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile()) {
// 是文件,直接删除
if (!file.delete()) {
return false;
}
} else if (file.isDirectory()) {
// 是目录,继续递归删除
if (!deletePacketsByDirectory(file)) {
return false;
}
}
}
}
return rootFile.delete();
}
附(Android获取默认路径):
Environment.getDataDirectory().getPath()--------------->/data
Environment.getDownloadCacheDirectory().getPath()------>/cache
Environment.getExternalStorageDirectory().getPath()---->/mnt/sdcard
Environment.getRootDirectory().getPath()--------------->/system
Context.getCacheDir().getPath() ----------------------->/data/data/包名/cache
Context.getExternalCacheDir().getPath()---------------->/mnt/sdcard/Android/data/包名/cache
Context.getFilesDir().getPath()------------------------>/data/data/包名/files
Context.getObbDir().getPath()-------------------------->/mnt/sdcard/Android/obb/包名
Context.getPackageName()------------------------------->包名
Context.getPackageCodePath()--------------------------->/data/app/包名-1.apk
Context.getPackageResourcePath()----------------------->/data/app/包名-1.apk