当前位置: 移动技术网 > IT编程>开发语言>Java > Android如何实现计算缓存空间大小和删除缓存文件功能

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

2020年07月23日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网