【Java文件操作(四)】递归套递归,计算每个文件夹大小

it2022-05-05  127

我的博客——Java文件操作系列

【Java文件操作(一)】递归打印文件目录

【Java文件操作(二)】删除文件夹,但保留其内部文件

【Java文件操作(三)】递归复制文件夹内所有文件

【Java文件操作(四)】递归套递归,计算每个文件夹大小

【Java文件操作(五)】从txt文件中读取字符串、乱码原因

【Java文件操作(六)】借助内存复制图片:ByteArrayOutputStream\FileOutputStream等辨析

【Java 编码转换】将汉字转化为gb2312编码


思路

在main中调用visit函数,递归访问每个文件夹

在visit函数中调用calculateSize函数,递归计算当前文件夹的大小,然后输出当前文件路径、文件大小

写了两个多小时才写出来,我好菜啊。递归套递归,效率不能更低了…肯定会有更好的方法


代码

版本1:输出到控制台

package cn.hanquan.test; import java.io.*; /* * 递归套递归,计算每个文件夹大小 */ public class DirCount { public static String SRC = "C:\\Users\\Bug\\Desktop\\College Files\\4-毛概"; /* ------递归遍历文件夹 递归函数------ * 参数: File f 要访问的文件/文件夹 * int i 递归深度 * 返回值: 无 */ public static void visit(File f, int i) { for (int j = 0; j < i; j++) { System.out.print("-"); } System.out.println(f.getPath() + "\t\t大小:" + calculateSize(f, 0)); if (f.isDirectory()) { File[] files = f.listFiles(); for (File t : files) { visit(t, i + 1); } } } /* --------计算文件大小 递归函数-------- * 参数: File f 要计算的文件/文件夹 * long l 已经计算过的文件累计大小 * 返回值: 文件 File f 的大小 */ public static long calculateSize(File f, long l) { long curLen = l; if (f.isFile()) // 文件 return f.length(); if (f != null && f.exists()) { // 文件夹 for (File s : f.listFiles()) { if (s.isFile()) { curLen += s.length(); } else { curLen = calculateSize(s, curLen);// 递归访问 并接收其所有子文件夹的累计大小 } } } return curLen; } public static void main(String[] args) { visit(new File(SRC), 0); } }

运行效果

C:\Users\Bug\Desktop\College Files\4-毛概 大小:3090637 -C:\Users\Bug\Desktop\College Files\4-毛概\中国人你要自信.docx 大小:21229 -C:\Users\Bug\Desktop\College Files\4-毛概\中国人你要自信.txt 大小:14659 -C:\Users\Bug\Desktop\College Files\4-毛概\复习资料 大小:1398883 --C:\Users\Bug\Desktop\College Files\4-毛概\复习资料\毛概 - 副本.docx 大小:60321 --C:\Users\Bug\Desktop\College Files\4-毛概\复习资料\毛概.docx 大小:60321 --C:\Users\Bug\Desktop\College Files\4-毛概\复习资料\毛概23页 new.pdf 大小:467120 --C:\Users\Bug\Desktop\College Files\4-毛概\复习资料\毛概23页 new_带考题批注.pdf 大小:385908 --C:\Users\Bug\Desktop\College Files\4-毛概\复习资料\毛概23页.pdf 大小:401976 --C:\Users\Bug\Desktop\College Files\4-毛概\复习资料\答题方式.txt 大小:361 --C:\Users\Bug\Desktop\College Files\4-毛概\复习资料\考试样题.docx 大小:22876 -C:\Users\Bug\Desktop\College Files\4-毛概\材料分析题.docx 大小:19872 -C:\Users\Bug\Desktop\College Files\4-毛概\毛概 大小:733818 --C:\Users\Bug\Desktop\College Files\4-毛概\毛概\毛概 大小:733818 ---C:\Users\Bug\Desktop\College Files\4-毛概\毛概\毛概\2017毛概复习知识点.pdf 大小:308882 ---C:\Users\Bug\Desktop\College Files\4-毛概\毛概\毛概\毛概 (合).docx 大小:27327 ---C:\Users\Bug\Desktop\College Files\4-毛概\毛概\毛概\毛概1-9章题库全 - 副本.doc 大小:119296 ---C:\Users\Bug\Desktop\College Files\4-毛概\毛概\毛概\毛概1-9章题库全.doc 大小:121344 ---C:\Users\Bug\Desktop\College Files\4-毛概\毛概\毛概\毛概整理.docx 大小:35563 ---C:\Users\Bug\Desktop\College Files\4-毛概\毛概\毛概\毛概期末考试题库(2015年最新).docx 大小:106432 ---C:\Users\Bug\Desktop\College Files\4-毛概\毛概\毛概\研究性学习.docx 大小:14974 -C:\Users\Bug\Desktop\College Files\4-毛概\毛概.rar 大小:608019 -C:\Users\Bug\Desktop\College Files\4-毛概\毛概1,6章.docx 大小:16868 -C:\Users\Bug\Desktop\College Files\4-毛概\毛概1113.docx 大小:28689 -C:\Users\Bug\Desktop\College Files\4-毛概\毛概25页.docx 大小:53264 -C:\Users\Bug\Desktop\College Files\4-毛概\毛概期末选择题题库.doc 大小:131584 -C:\Users\Bug\Desktop\College Files\4-毛概\第7,8章.docx 大小:19061 -C:\Users\Bug\Desktop\College Files\4-毛概\第9、10章.docx 大小:22610 -C:\Users\Bug\Desktop\College Files\4-毛概\第四、五章.docx 大小:22081

文件夹界面


版本2:输出txt文件

package cn.hanquan.test; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; //简单的txt文件复制 public class FileOutputStreamTest { public static String SRC = "C:\\Users\\Bug\\Desktop\\College Files\\0-区块链"; static StringBuilder str = new StringBuilder(); public static void main(String[] args) throws IOException { visit(new File(SRC), 0); FileWriter fos = new FileWriter("C:\\Users\\Bug\\Desktop\\newFileList.txt"); byte[] bbuf = new byte[32]; fos.write(str.toString()); fos.close(); //System.out.println(str); } public static void visit(File f, int i) throws IOException { for (int j = 0; j < i; j++) { str.append("-"); System.out.print("-"); } str.append(f.getPath() + "\t\t大小:" + calculateSize(f, 0) + "\r\n"); System.out.println(f.getPath() + "\t\t大小:" + calculateSize(f, 0)); if (f.isDirectory()) { File[] files = f.listFiles(); for (File t : files) { visit(t, i + 1); } } } public static long calculateSize(File f, long l) { long curLen = l; if (f.isFile()) // 文件 return f.length(); if (f != null && f.exists()) { // 文件夹 for (File s : f.listFiles()) { if (s.isFile()) { curLen += s.length(); } else { curLen = calculateSize(s, curLen);// 递归访问 并接收其所有子文件夹的累计大小 } } } return curLen; } }

附:使用CommonsIo组件操作方式,不需要重复造轮子


最新回复(0)