【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); } }文件夹界面
版本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组件操作方式,不需要重复造轮子