Android如何实现计算缓存空间大小和删除缓存文件功能
Android如何实现计算缓存空间大小和删除缓存文件功能
- 1. 缓存文件所在路径
- 2. File类的基本用法
- 3. 完成代码
- 4. Environment.getExternalStorageState()
- 参考材料
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
更多相关文章
- Google API V2申请及Google Map简单应用例子
- Android(安卓)Studio快捷键
- Android(安卓)文件路径详解
- AndroidStudio打包及引用aar - Android
- 修改和制作Android开机Logo(最终版)
- Android(安卓)studio使用JNI实例(1)
- android 桌面文件夹ui美化
- Android(安卓)Jetpack应用指南学习笔记6——Navigation(一)基本
- cocos安卓打包出现的:未指定Android目标平台