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; } }
评论前必须登录!
注册