思路
在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
组件操作方式,不需要重复造轮子