- public class Test15 {
- private static String subFile;
- /**
- * @param args
- * 把一个目录中的所有文本拷贝,存入一个txt文件,统计每个字符出现的次数并输出,例如:a: 21 次 b: 15 次 c:: 15 次 把: 7 次...
- *
- * 分析:
- * 1、创建File对象,关联文件夹路径
- * 2、调一个方法,将File路径传入方法,返回值是HashMap
- * 3、方法内部创建HashMap集合
- * 4、获取File路径下所有文件夹和文件,并遍历
- * 5、判断路径如果是文件,后缀并是txt,就创建字符输入流读取该文件
- * 6、将读取到的没一行字符串,转换成字符数组,遍历
- * 7、将遍历的每个字符存入集合,如果集合中已经包含了这个键,就将键对应的值+1存入
- * 8、关流
- * 9、判断路径是文件夹路径就递归调用
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- File file = new File("E:\\源文件夹\\TXT"); //1、创建File对象,关联文件夹路径
- HashMap<Character, Integer> hm = getReader(file); //2、调一个方法,将File路径传入方法,返回值是HashMap
- }
- private static HashMap<Character, Integer> getReader(File file) throws Exception {
- HashMap<Character, Integer> hm = new HashMap<>(); //3、方法内部创建HashMap集合
- File[] subFiles = file.listFiles(); //4、获取File路径下所有文件夹和文件,并遍历
- for (File subFile : subFiles) {
- if(subFile.isFile() && subFile.getName().endsWith(".txt")) { //5、判断路径如果是文件,后缀并是txt,就创建字符输入流读取该文件
- BufferedReader br = new BufferedReader(new FileReader(subFile));
- String len;
- while((len = br.readLine()) != null) {
- char[] arr = len.toCharArray(); //6、将读取到的没一行字符串,转换成字符数组,遍历
- for (char c : arr) {
- hm.put(c, hm.containsKey(c) ? hm.get(c) + 1 : 1); //7、将遍历的每个字符存入集合,如果集合中已经包含了这个键,就将键对应的值+1存入
- }
- }
- br.close(); //关流
- }else if(subFile.isDirectory()) { //9、判断路径是文件夹路径就递归调用
- hm.putAll(getReader(subFile));
- }
- }
- return hm;
- }
- }
复制代码
怎么把每次递归返回的集合对象想合并
就像统计一个路径的大小
- public static long getFileLength(File dir) { //dir = F:\day06\day07
- //1,定义一个求和变量
- long len = 0;
- //2,获取该文件夹下所有的文件和文件夹listFiles();
- File[] subFiles = dir.listFiles(); //day07 Demo1_Student.class Demo1_Student.java
- //3,遍历数组
- for (File subFile : subFiles) {
- //4,判断是文件就计算大小并累加
- if(subFile.isFile()) {
- len = len + subFile.length();
- //5,判断是文件夹,递归调用
- }else {
- len = len + getFileLength(subFile);
- }
- }
- return len;
- }
复制代码 |
|