JAVA 获取指定目录下各级子目录中每种类型文件的个数

package learn;

import java.io.File;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.Map.Entry;

public class Demo2 {

	public static void main(String[] args) {
		// 获取指定目录下各级子目录中每种类型文件的个数

		String path = "E:/";
		
		getFileName(path,"");// 递归获取目录及文件信息的方法
	}

	// 递归获取目录及文件信息的方法
	public static void getFileName(String path, String space) {
		File rootFile = new File(path);
		
		// 1.本层级文件信息数组
		File[] files = rootFile.listFiles();

		// 2. Map 用于储存在每层递归中 【文件后缀 ==> 出现次数】的映射关系 
		//    TreeMap 相较于 HashMap 保持了插入顺序
		Map<String, Integer> fileNumMap = new TreeMap<String, Integer>();
		int num = 1;// 此后缀类型文件出现次数
		
		// 3. 遍历文件数组 找出对应的文件 和 目录
		for (File fileItem : files) {
			// 4. 如果是目录 输出目录名 并输出对应的【|---】分隔字串
			if(fileItem.isDirectory()) {
				System.out.println(space + fileItem.getName());
			}
			
			// 5. 如果是文件 利用上述创建的Map集合 以 【文件后缀 ==> 出现次数】的映射关系 来存储
			if(fileItem.isFile()) {
				String fileName = fileItem.getName();// 获取文件名
				String extName = getFileExt(fileName);// 获取文件后缀名
				
				// 5.1 维护出现次数的逻辑
				if(fileNumMap.containsKey(extName)) {
					num++;
				}

				// 5.2 存值
				fileNumMap.put(extName, num);
			}
			
			// 5.3  如果是目录 再次递归调用本方法 
			//      可能会因为目录无权限打开导致的空指针异常,所以用try catch 来包裹下
			if(fileItem.isDirectory()) {
				try {
					getFileName(fileItem.getPath(), space + "|---");
				} catch (Exception e) {
					System.out.println(space + fileItem.getName() + "目录无权限访问");
				}
			}
		}
		
		// 6. 打印上述存储的本文件夹层级中的 Map 集合信息
		Set<Entry<String,Integer>> set = fileNumMap.entrySet();
		for (Entry<String,Integer> item : set) {
			System.out.println(space + "【." + item.getKey() + "】文件   " + item.getValue() + "个");
		}
	}
	
	// 获取文件后缀名
	public static String getFileExt(String fileName) {

		String[] fileExtArr = fileName.split("\\.");
		
		return fileExtArr[fileExtArr.length - 1];
	}

}

附上本机的执行结果

$RECYCLE.BIN
|—S-1-5-21-4252138582-3700411359-3807062794-1001
|—|---【.ini】文件 1个
JAVA-CODE
|—.idea
|—|---【.gitignore】文件 1个
|—|---【.html】文件 1个
|—|---【.xml】文件 5个
|—day_01
|—|---test
|—|---|—cn
|—|---|—|---LiuYang
|—|---|—|---|—day_01
|—|---|—|---|—|---【.class】文件 2个
|—|---|—|---ZhaoSi
|—|---|—|---|—day_01
|—|---|—|---|—|---【.class】文件 2个
|—|---|—【.java】文件 2个
|—|---【.class】文件 3个
|—|---【.java】文件 2个
|—day_02
|—|---【.txt】文件 1个
|—day_03
|—|---【.class】文件 4个
|—|---【.java】文件 5个
|—day_04
|—|---【.class】文件 6个
|—|---【.java】文件 7个
|—day_05
|—|---【.class】文件 1个
|—|---【.java】文件 1个
|—day_06
|—|---【.class】文件 3个
|—|---【.java】文件 4个
|—day_07
|—|---【.java】文件 1个
|—day_10
|—|---【.class】文件 1个
|—|---【.java】文件 1个
|—day_11
|—|---【.CHM】文件 1个
|—|---【.doc】文件 1个
|—|---【.pdf】文件 1个
|—day_12
|—|---resume
|—|---|—css
|—|---|—|---【.css】文件 1个
|—|---|—img
|—|---|—|---【.jpg】文件 1个
|—|---|—js
|—|---|—【.html】文件 1个
|—|---【.pdf】文件 1个
|—homework
|—|---day_02
|—|---|—【.class】文件 1个
|—|---|—【.java】文件 1个
|—|---day_03
|—|---|—【.class】文件 3个
|—|---|—【.java】文件 4个
|—|---day_04
|—|---|—【.class】文件 1个
|—|---|—【.java】文件 1个
|—|---day_05
|—|---|—【.class】文件 6个
|—|---|—【.java】文件 7个
|—|---day_06
|—|---|—【.class】文件 10个
|—|---|—【.java】文件 11个
|—|---day_07
|—|---|—【.class】文件 1个
|—|---|—【.java】文件 1个
|—|---day_08
|—|---|—【.class】文件 8个
|—|---|—【.java】文件 9个
|—|---day_10
|—|---|—【.class】文件 1个
|—|---|—【.java】文件 1个
|—src
|—|---com
|—|---|—company
|—|---|—|---【.java】文件 1个
|—【.iml】文件 1个
|—【.zip】文件 1个
MyPro
|—.idea
|—|---【.gitignore】文件 1个
|—|---【.html】文件 1个
|—|---【.xml】文件 5个
|—out
|—|---production
|—|---|—MyPro
|—|---|—|---com
|—|---|—|---|—company
|—|---|—|---|—|---【.class】文件 2个
|—src
|—|---com
|—|---|—company
|—|---|—|---【.java】文件 2个
|—【.iml】文件 1个
System Volume Information
System Volume Information目录无权限访问
【.avi】文件 1个
【.txt】文件 1个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值