Android如何实现计算缓存空间大小和删除缓存文件功能
Android如何实现计算缓存空间大小和删除缓存文件功能
1. 缓存文件所在路径
文件的存储分为内部存储(Internal Storage)和外部存储(External Storage),这里的内部存储和外部存储不是指物理意义上的内部存储(手机自带的存储卡)和外部存储(手机额外使用的SD卡),而是逻辑意义上的内部存储和外部存储。
也就是说,Android将手机自带的存储卡分为两个部分,其中内部存储的部分对我们用户不可见,而外部存储的部分对我们用户是可见的。
而我们的缓存文件一般存放在如下路径:
内部存储:/data/data/你的应用包名/cache
外部存储:/storage/self/primary/Android/data/应用包名/cache
两个存储位置不是真的要由我们去填写路径,Context类中有提供getCacheDir()方法和getExternalCacheDir()方法直接获取相应路径。在获取到路径之后就可以用File类去删除文件或者计算文件长度了。
2. File类的基本用法
这里简单介绍一下接下来File类要用到的几个方法
.方法名 | 说明 |
public boolean exists() | 判断路径下的文件或目录是否存在 |
public long length() | 计算文件的大小(单位是b,转换成kb要除以1024) 注意只会计算文件的长度,目录一般返回是0 |
public boolean isDirectory() | 判断路径是否是目录 |
public boolean isFile() | 判断路径是否是文件 |
public File[] listFiles() | 返回一个路径名数组,这些路径名表示目录中的文件。 如果是目录,会返回一个数组;如果是文件,返回null |
public boolean delete() | 删除路径所在的文件或文件夹 对于文件夹而言,只能删除空文件夹 对于文件而言,如果没有写权限无法删除 |
顺便写了一个测试用的代码,在D盘创建一个test文件夹,在里面创建test.txt文件和test1.txt文件,里面填充任意内容,运行下面的代码测试(看看效果)。
public class FileTem {
public static void main(String[] args) {
File dir = new File("D:\\test");
System.out.println("dir.exists(): " + dir.exists());
System.out.println("dir.length(): " + dir.length());
System.out.println("dir.isDirectory(): " + dir.isDirectory());
System.out.println("dir.isFile(): " + dir.isFile());
System.out.println("dir.listFiles().length: " + dir.listFiles().length); //文件夹下面的文件数量
System.out.println("dir.delete(): " + dir.delete()); // 删除文件夹,当文件夹内部不为空的时候,无法删除(也就是说只能删除空文件夹)
System.out.println("——————————————————————");
File file = new File("D:\\test\\test.txt");
System.out.println("file.exists(): " + file.exists());
System.out.println("file.length(): " + file.length()); // 单位是b,转换成kb要除以1024,转成mb再除以1024,以此类推
System.out.println("file.isDirectory(): " + file.isDirectory());
System.out.println("file.isFile(): " + file.isFile());
System.out.println("file.listFiles(): " + file.listFiles()); // 文件下面是为空
System.out.println("file.delete(): " + file.delete()); // 删除文件,删除成功返回true,注意删除的文件不会放到回收站中
}
}
3. 完成代码
public class CacheUtil {
// 只需要调用getCacheSize方法和ClearCache方法,Context传Activity的实例即可。
private static final String TAG = "CacheUtil";
/**
* 计算缓存大小
* @param context
* @return
*/
public static String getCacheSize(Context context){
long cacheSize = getFolderSize(context.getCacheDir());
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ // 判断外部存储是否可用
cacheSize += getFolderSize(context.getExternalCacheDir());
}
return formatSize(cacheSize);
}
/**
* 删除缓存
* @param context
*/
public static void clearCache(Context context){
deleteFolder(context.getCacheDir());
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
deleteFolder(context.getExternalCacheDir());
}
}
/**
* 计算文件夹内部文件大小总和
* @param file 文件夹
* @return 文件大小总和
*/
private static long getFolderSize(File file) {
long size = 0;
try{
File[] files = file.listFiles(); // 获取文件夹内的文件列表
for (File file1: files){
if (file1.isDirectory()){ // 如果某文件是文件夹,计算内部总和
size += getFolderSize(file1);
}else{
size += file1.length();
}
}
}catch (Exception e){
e.printStackTrace();
}
return size;
}
/**
* 将缓存换算成对应的单位
* @param cacheSize 缓存大小
* @return String类型的缓存大小
*/
private static String formatSize(long cacheSize) {
double kb = cacheSize/1024;
if (kb < 1){ // cacheSize在 0-1024内, 单位为b
return cacheSize/1024 + "B";
}
double mb = kb/1024;
if (mb < 1){
return String.format("%.2f", kb) + "KB";
}
double gb = mb/1024;
if (gb < 1) {
return String.format("%.2f", mb) + "MB";
}
return String.format("%.2f", gb) + "GB";
}
/**
* 删除文件夹
* @param dir 文件夹路径
*/
private static void deleteFolder(File dir) {
try{
File[] files = dir.listFiles();
for (File file: files){
if (file.isDirectory()){
deleteFolder(file);
}else
file.delete();
}
dir.delete();
}catch (Exception e){
e.printStackTrace();
}
}
}
4. Environment.getExternalStorageState()
介绍一下这个方法,这个方法主要是判断外部存储的状态。
我们需要判断外部存储在正常工作时,才获取外部存储的路径。
列个表格介绍一下Environment.getExternalStorageState()的常用返回值:
返回值(String类型常量) | 说明 |
MEDIA_CHECKING | 正在检查存储介质 |
MEDIA_REMOVED | 存储介质不存在或者已被移除 |
MEDIA_MOUNTED | 存储介质已经装载,并且有读/写权限 |
MEDIA_MOUNTED_READ_ONLY | 存储介质已经装载,但是只拥有只读权限 |
MEDIA_SHARED | 存储介质正在通过usb数据线共享数据中 |
参考材料
Android 手机app缓存清理实现_琦琦的博客-CSDN博客_android 清理app缓存
https://blog.csdn.net/qq_26296197/article/details/79290277
android的Environment类 - 简书
https://www.jianshu.com/p/946d98ecd23f
Java File类 | 菜鸟教程
https://www.runoob.com/java/java-file.html
本文地址:https://blog.csdn.net/qq_41872247/article/details/107492913
上一篇: 揭秘:如何做好链接提升网站排名
下一篇: 经验总结:社群建设的五个注意事项