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);
}
}
}
}