import java.io.File;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
/*
* 递归遍历文件夹取每个类型数量及父文件夹大小
*/
public class NewWorks {
// 创建静态fileMap集合,因为存在递归遍历,Map集合放在局部变量内会导致前Map集合被覆盖
static HashMap<String, Integer> fileMap = new HashMap<String, Integer>();
// 定义静态long类型成员变量,用于递归储存文件尺寸
static long fileSize;
public static void main(String[] args) {
// 调用addFileMap,提供file类对象做参数
File file = new File("d:\\e源码");
addFileMap(file);
// 遍历fileMap开始
Set<String> fileName = fileMap.keySet();
Iterator<String> fileIt = fileName.iterator();
while (fileIt.hasNext()) {
String fileKey = fileIt.next();
Integer fileValue = fileMap.get(fileKey);
System.out.println("数量:" + fileValue + "\t\t类型:" + fileKey);
}
System.out.println(file.getName() + "\t占用空间:"+formatFileSize(fileSize));
// 遍历fileMap结束
}
// 添加addFileMap方法,用于递归遍历目录并计算文件尺寸
public static void addFileMap(File dir) {
// 调用file类方法listFiles遍历参数目录,返回file数组
File fileArr[] = dir.listFiles();
// foreach循环遍历开始
for (File f : fileArr) {
// 如果是文件夹,则进行方法递归遍历
if (f.isDirectory()) {
// 判断fileMap集合中是否包含字符串"文件夹"的键
if (fileMap.containsKey("文件夹"))
// 如果true,修改fileMap<"文件夹",原值>的值为原值+1
fileMap.put("文件夹", fileMap.get("文件夹") + 1);
else {
// 否则添加初始化数据值为1
fileMap.put("文件夹", 1);
}
// 方法递归
addFileMap(f);
} else{
// 否则调用方法addCount为fileMap添加数据
addCount(f.toString());
// 计数器计算文件尺寸
fileSize+=f.length();
}
}
// foreach循环结束
}
// 添加addCount方法,用于添加fileMap数据
public static void addCount(String name) {
// 定义String类型suffix成员变量,值为文件后缀名
String suffix = name.substring(name.lastIndexOf(".") + 1);
// 判断fileMap集合中是否包含字符串 suffix 的键
if (fileMap.containsKey(suffix))
// 如果true,修改fileMap<suffix,原值>的值为原值+1
fileMap.put(suffix, fileMap.get(suffix) + 1);
else
// 否则添加初始化数据值为1
fileMap.put(suffix, 1);
}
// 添加formetFileSize方法,用于转换文件尺寸单位(来自网络)
public static String formatFileSize(long fileS) {
DecimalFormat df = new DecimalFormat("#.00");
String fileSizeString = "";
if (fileS < 1024) {
fileSizeString = df.format((double) fileS) + "B";
} else if (fileS < 1048576) {
fileSizeString = df.format((double) fileS / 1024) + "K";
} else if (fileS < 1073741824) {
fileSizeString = df.format((double) fileS / 1048576) + "M";
} else {
fileSizeString = df.format((double) fileS / 1073741824) + "G";
}
return fileSizeString;
}
}
评论前必须登录!
注册