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

更多相关文章

  1. Google API V2申请及Google Map简单应用例子
  2. Android(安卓)Studio快捷键
  3. Android(安卓)文件路径详解
  4. AndroidStudio打包及引用aar - Android
  5. 修改和制作Android开机Logo(最终版)
  6. Android(安卓)studio使用JNI实例(1)
  7. android 桌面文件夹ui美化
  8. Android(安卓)Jetpack应用指南学习笔记6——Navigation(一)基本
  9. cocos安卓打包出现的:未指定Android目标平台

随机推荐

  1. 【Android】解析Paint类中MaskFilter的使
  2. Android(安卓)代码质量工具集成与应用
  3. 《Android(安卓)Security Internals》第
  4. android Java代码的启动
  5. Android(安卓)上层应用读写底层设备节点(
  6. Android利用Http下载文件
  7. ADB无法找到Android设备
  8. Building Two Versions of the Same Andr
  9. LinearLayout 内部 挂件 居中
  10. Android——新手指引 指定View高光显示自