class Statistical {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //提示用户输入一个目录路径
        System.out.print("请输入要统计的文件夹路径:");
        String dirPath = sc.nextLine();
        //封装成文件对象
        File dir = new File(dirPath);
        /*
         * 对文件的一些判断,是否存在和是否是目录
         */
        if (! dir.exists()) {
            System.out.println("该文件路径不存在");
            return ;
        }
        if (dir.isFile()) {
            System.out.println("请指定一个目录");
            return ;
        }
        long count = count(dir);//获得文件总字节数
        System.out.println(dir.getName() + "的大小为" + transform(count));//输出文件夹大小
    }
    
    public static String transform(long count) {
        int times = 0;
        while (count > 1024) {
            count /= 1024;
            times ++;
        }
        switch (times) {
        case 1:
            return count + "KB";
        case 2:
            return count + "MB";
        case 3:
            return count + "GB";
        case 4:
            return count + "TB";
        case 5:
            return count + "PB";
        default:
            return null;
        }
    }
    
    public static long count(File dir) {
        File[] files = dir.listFiles();
        long sum = 0;
        for (File file : files) {
            if (file.isFile()) {
                sum += file.length();
            } else if (file.isDirectory()) {
                sum += count(file);
            }
        }
        return sum;
    }
}

递归是在操作文件经常会采用的一种算法,尤其是对文件夹做操作时:比如统计文件夹大小,复制文件夹,删除文件夹等,都要用到递归的算法,使用递归算法能让以前较难的逻辑简单化。
统计文件夹的大小实际上就是列出文件夹中的所有文件,统计每个文件的大小,如果是文件夹,就要再重新列出这个文件夹的所有文件,再统计。可以看出,列出文件夹的所有文件和统计文件夹是重复的动作,所以这时用递归就解决这个问题,如果是文件夹,就重新调用这个方法,把遍历到的文件夹作为参数传过去。最后就能计算出文件夹的总大小了。
我还做了一个判断文件大小的这个小功能,就是能把最后计算出来的字节大小转换成适合单位的大小再打印,比如2049B 会显示2K而不是1029B

最新文章

  1. Spring Security3中的-authentication-manager标签详解
  2. IOS 公共类-MyMBProgressUtil Progress显示
  3. SVM基本思想和对偶推导笔记-记录毕业论文1
  4. VSSより、指定したファイルを取得するマクロ(パス入り)
  5. BZOJ2149 : 拆迁队
  6. 【java】:定时任务
  7. UESTC 901 方老师抢银行 --Tarjan求强连通分量
  8. 【转】B树、B-树、B+树、B*树
  9. JPA && Spring Data && Spring Data JPA
  10. bzoj2427
  11. KEIL中的一些细节
  12. React 实践项目 (三)
  13. jQuery插件之-----弹性运动
  14. Oracle配置SQL空间操作要点说明
  15. ModuleNotFoundError: No module named 'Crypto.Cipher'
  16. [UE4][Canvas]用C++代码绘制血条(HealthBar)
  17. zabbix 短信报警
  18. JS中判断某个字符串是否包含另一个字符串的五种方法
  19. Java SSM框架之MyBatis3(八)MyBatis之动态SQL
  20. 记录一下获取浏览器可视区域的大小的js

热门文章

  1. RK3399参考设计方案之DC-DC电源芯片RK808D【转】
  2. 织梦CMS首页、列表页文章如何调出该文章TAG标签?
  3. c#-关于自动属性的思考
  4. [原创]java合并word文件
  5. JAVA线程同步 (一)wait(), notify()和notifyAll()使用
  6. Code-NFine:jqgrid 数据绑定
  7. Flink架构及其工作原理
  8. Spherical Harmonics Lighting
  9. git apply failed (转载)
  10. 基于事件驱动机制,在Service Mesh中进行消息传递的探讨