安卓开发中Cache模块(文件读写操作)

activity中的代码

package com.example.tuhuadmin.fanxinglei.widget;

import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.TextView;

import com.example.tuhuadmin.fanxinglei.BaseActivity;
import com.example.tuhuadmin.fanxinglei.R;
import com.example.tuhuadmin.fanxinglei.utils.CacheUtils;

/**
 * Created on 2016/8/2.
 * Author:crs
 * Description:XXX
 */
public class CacheActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cache);

        initViews();
        initCache();
    }

    private void initCache() {
        //在启动页面中,计算缓存文件的大小,如果大于50M,就自动清理
        //获取缓存具体大小
        Long cacheSize = getTotalCacheSize(this);
        if (cacheSize > 50 * 1024 * 1024) {
            clearCacheDir(this);
        }
    }

    private void initViews() {
        final TextView tv = (TextView) findViewById(R.id.tv);
        //获取缓存文件的大小(两部分的内容) 获取的是整数
        String size = getTotalCacheSize(this) / 1024 / 1024 + "";
        tv.setText(size + "MB");

        findViewById(R.id.btn_frag).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //清理缓存的操作
                clearCacheDir(CacheActivity.this);
                tv.setText("0.00MB");
            }
        });
    }

    private void clearCacheDir(Context context) {
        //清理所有缓存  两部分:手机内存和sd卡
        CacheUtils.clearAllCache(context);
    }

    private Long getTotalCacheSize(Context context) {
        //缓存有两部分sd卡和手机内存
        long cacheSize = CacheUtils.getFolderSize(context.getCacheDir());
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
            //getExternalCacheDir()获取sd卡中的缓存目录
            cacheSize += CacheUtils.getFolderSize(context.getExternalCacheDir());
        }
        return cacheSize;
    }
}

工具类中的代码:

package com.example.tuhuadmin.fanxinglei.utils;

import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;

import java.io.File;

/**
 * Created on 2016/8/2.
 * Author:crs
 * Description:缓存工具类
 */
public class CacheUtils {

    //获取文件(可以看手机的sd存储)
    //Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
    //Context.getExternalCacheDir() --> SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据

    //获取缓存大小
    public static long getFolderSize(File cacheDir) {
        long size = 0;
        //指定文件夹中, 所有的File对象
        File[] files = cacheDir.listFiles();
        for (File cacheFile : files) {
            if (cacheFile.isDirectory()) {
                //这里是一个递归操作,一定要注意
                size += getFolderSize(cacheFile);
            } else {
                //获得文件字节大小
                size += cacheFile.length();
            }
        }
        return size;
    }

    //清理所有缓存
    public static void clearAllCache(Context context) {
        //应用内置的缓存
        deleteDir(context.getCacheDir());
        //sd卡缓存
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
            deleteDir(context.getExternalCacheDir());
        }
        //自定义的缓存目录
        CacheUtils.deleteFolderFile("/sdcard/" + context.getPackageName() + "/crash/", false);
    }

    private static boolean deleteDir(File CacheDir) {
        //循环遍历删除
        if (CacheDir.exists() && CacheDir.isDirectory()) {
            //指定文件夹中,所有的文件与子文件夹的名称
            String[] list = CacheDir.list();
            for (int i = 0; i < list.length; i++) {
                String fileName = list[i];
                //子文件和父文件重新封装成一个文件
                boolean result = deleteDir(new File(CacheDir, fileName));
                if (!result) {
                    return false;
                }
            }
        }
        //最后删除空的文件夹    public boolean delete(): 删除文件或者空文件夹  返回值为boolean
        return CacheDir.delete();
    }

    //删除外置缓存文件夹
    public static void deleteFolderFile(String filePath, boolean deleteThisPath) {
        if (!TextUtils.isEmpty(filePath)) {
            File file = new File(filePath);
            //先判断文件存不存在,再判断是文件还是文件夹
            if (file.isDirectory()) {
                File[] files = file.listFiles();
                for (File innerFile : files) {
                    deleteFolderFile(innerFile.getAbsolutePath(), true);
                }
            }
            //这个方法是干嘛的啊,不太理解
            if (deleteThisPath) {
                if (!file.isDirectory()) {//如果是文件,删除
                    file.delete();
                } else {
                    if (file.listFiles().length == 0) {//如果是空的文件夹,删除
                        file.delete();
                    }
                }
            }
        }
    }
}

创建文件后,先判断文件是不是存在,然后再在判断文件还是文件夹

public File(String pathname) : 通过文件路径 封装成 File对象。其实 pathName指向的是一个文件或者文件夹
public File(String parent,String child): 通过父目录(文件夹)路径, 文件或者文件夹名称来封装成File对象(p arent必须是文件夹路径 )

public File(File parent,String child): 通过File对象与文件或者文件夹名称,来封装成File对象


File常见的操作:

创建、删除、判断类型、获取功能、高级功能


创建功能:
  public boolean createNewFile(): 创建文件   
  返回值: true, 创建一个新的文件
  返回值: false, 当前File对象所表示的文件已经存在了, 不再创建新文件
  
  //创建文件夹
  public boolean mkdir() 创建文件夹
  返回值: true, 创建一个新的文件夹
  返回值:  false, 当前File对象所表示的文件夹已经存在了, 不再创建新文件夹
  
  public boolean mkdirs(): 创建多层文件夹


删除功能:
public boolean delete(): 删除文件或者空文件夹
注意: java程序删除  不经过回收站
想删除带有内容的文件夹 怎么办?
先把文件夹中的内容全删了, 再删除文件夹


重命名功能:
public boolean renameTo(File dest)
参数: dest  新名称


如果两个File对象, 同一个文件夹的时候, renameTo()重命名功能
如果两个File对象, 不是同一个文件夹的时候, renameTo()剪切 + 重命名功能


判断功能:
public boolean isDirectory(): File所代表的文件 , 是否为文件夹
public boolean isFile() : 是否为文件
public boolean exists() : 文件是否存在
public boolean canRead() : 是否可读
public boolean canWrite() : 是否可写
public boolean isHidden() : 是否为 隐藏文件


获取功能:
public String getAbsolutePath(): 获取绝对路径
public String getPath() : 获取相对路径
public String getName() : 获取文件名称
public long length() : 获取文件的大小( 返回的长度为文件的字节大小
public long lastModified() : 获取文件的最后修改时间


高级获取功能:
public String[]   list() : 指定文件夹中 所有的文件与子文件夹的名称

public File[]   listFiles() : 指定文件夹中所有的File对象(所有的文件集合)


 //获取文件(可以看手机的sd存储)
 //Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
 //Context.getExternalCacheDir() --> SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据


递归: 在方法的内部,调用本方法.
使用递归的前提:
1:指定递归规则(什么时候使用递归)
2: 出口条件(什么时候递归完成,方法不再调用)
使用递归的注意事项:
递归次数不能过多, 会报出栈溢出异常

package com.example.tuhuadmin.fanxinglei.widget;

import java.io.File;

/**
 * Created on 2016/8/2.
 * Author:crs
 * Description:文件操作
 */
public class FileClass {
    public static void main(String[] args) {

        //联系1: 获取指定目录下所有的.mp3 文件,并打印它们的名字。
        //思路:封装fil对象、获取所有的File对象、遍历,得到每一个File对象、判断当前File对象的名字的后缀名是否为.jpg
        test1();
        test2();
    }

    private static void test2() {
        File file = new File("D:\\");
        File[] files = file.listFiles();
        for (File file1 : files) {
            String name = file1.getName();
            //获取这个字符的索引
            int index = name.indexOf("]");//indexOf( ) 获取指定位置上的索引
            String newName = name.substring(index + 1);//专治各种疼痛01.mp4  substring(2) (0,2) 字符串切割方法
            //封装成一个新的文件
            File newFile = new File(file, newName);
            //重新命名(旧的文件重命名成新的文件)
            file1.renameTo(newFile);
        }
    }

    private static void test1() {
        File file = new File("D:\\KuGou");
        File[] files = file.listFiles();
        //可能有多级文件夹 但这里没有处理
        for (File file1 : files) {
            //获取文件的名字,如果是文件的话,带后缀名,
            String name = file1.getName();
            if (name.endsWith(".mp3")) {
                //是:打印File的名字
                System.out.print(name);
            }
        }
    }
}



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值