欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android如何实现计算缓存空间大小和删除缓存文件功能

程序员文章站 2022-12-30 22:48:31
1. 缓存文件所在路径2. File的基本用法3. Environment类4.参考材料https://blog.csdn.net/qq_26296197/article/details/79290277Android 手机app缓存清理实现_琦琦的博客-CSDN博客_android 清理app缓存https://www.jianshu.com/p/946d98ecd23fandroid的Environment类 - 简书https://www.runoob.com/java/java-f...

1. 缓存文件所在路径

  文件的存储分为内部存储(Internal Storage)和外部存储(External Storage),这里的内部存储和外部存储不是指物理意义上的内部存储(手机自带的存储卡)和外部存储(手机额外使用的SD卡),而是逻辑意义上的内部存储和外部存储。
  也就是说,Android将手机自带的存储卡分为两个部分,其中内部存储的部分对我们用户不可见,而外部存储的部分对我们用户是可见的。
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文件,里面填充任意内容,运行下面的代码测试(看看效果)。
Android如何实现计算缓存空间大小和删除缓存文件功能

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