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

AJPFX:实现递归统计文件夹的总大小的更多相关文章

  1. linux如何查看目录或文件夹的总大小--du命令

    记录一下如何查看一个目录或文件夹的总大小. 使用du命令的选项-s,可以统计整个目录或文件夹的大小. 例如 du -sk ./ 156k -k表示以KB为单位计算.

  2. java基础 File 递归删除文件夹中所有文件文件夹 目录(包含子目录)下的.java文件复制到e:/abc文件夹中, 并统计java文件的个数

    File 递归删除文件夹中所有文件文件夹 package com.swift.kuozhan; import java.io.File; import java.util.Scanner; /*键盘录 ...

  3. 统计文件夹下java代码行数的小程序--主要是学习任务队列的思想

    首先感谢czbk的老师,录制的视频,让我们有这么好的学习资料.……—— 统计文件夹java文件的行数,首先想到的肯定是用递归的方法,因为文件夹下面可能包含文件夹,用递归的方法,代码容易写.(这和写简单 ...

  4. linux统计文件夹大小

    统计总大小: du -sh dirname 统计文件夹内部各文件大小及总大小: du -h dirname

  5. ls命名 | Linux统计文件夹内的文件个数

    ls命名 man ls -R 递归列出全部的目录内容 recusive -a 列出所有的文件(包括以 . 开头的隐藏文件) all -r 逆序排列 reverse -t 按照时间信息排序 time - ...

  6. 【File】递归删除文件夹中子级文件/夹,并删除文件夹

    今天有这样一个需求,需要删除某一个文件夹,但是文件夹中还有子级的文件 或者还可能会有文件夹在里面,所以就需要使用一个简单的递归才能将文件夹删除成功,包括文件夹中的子级文件/夹.!!! 其实很简单,就一 ...

  7. python (9)统计文件夹下的所有文件夹数目、统计文件夹下所有文件数目、遍历文件夹下的文件

    命令:os 用到的:os.walk   os.listdir 写的爬虫爬的数据,但是又不知道进行到哪了,于是就写了个脚本来统计文件的个数 #统计 /home/dir/ 下的文件夹个数 import o ...

  8. [C#]递归遍历文件夹

    /// <summary> /// 递归获取文件夹目录下文件 /// </summary> /// <param name="pathName"> ...

  9. Linux统计文件夹下文件信息

    统计当前文件夹里面有多少文件,即统计文件个数 ls -l |grep "^-"|wc -l 统计当前文件夹里面有多少文件夹,即统计文件夹个数 ls -l |grep "^ ...

随机推荐

  1. Ruby中任务构建工具rake的入门学习教程

    参考:http://www.jb51.net/article/81476.htm Rake简介 Rake的意思是Ruby Make,一个用ruby开发的代码构建工具. 但是,为什么Ruby需要Rake ...

  2. springboot 项目 docker化部署

    最近公司项目需要docker化,项目所使用的框架是springboot,linux环境.第一次接触docker化方面的技术.做的时候,所接触的新知识比较多,留下此文,以便以后用到的时候快速入手. 修改 ...

  3. (linux)main.c中的初始化

    main.c中的初始化 head.s在最后部分调用main.c中的start_kernel() 函数,从而把控制权交给了它. 所以启动程序从start_kernel()函数继续执行.这个函数是main ...

  4. 使用Windows Debugger调试托管代码----引用自官方帮助文档

    以下文字引用在Windbg的帮助文档.觉得对初次调试托管代码,非常有用,故粘贴至此. ========================================================= ...

  5. .Net线程池ThreadPool导致内存高的问题分析

    最近写了一个WinFrom程序.此程序侦听TCP端口,接受消息处理,然后再把处理后的消息,利用线程池通过WebService发送出去(即一进一出). 在程序编写完成后,进行压力测试.用Fiddler提 ...

  6. YTU 1055: 输入字符串以及输出

    1055: 输入字符串以及输出 时间限制: 1 Sec  内存限制: 128 MB 提交: 694  解决: 476 题目描述 编写一函数,由实参传来一个字符串,统计此字符串中字母.数字.空格和其它字 ...

  7. myeclipse8.6注册码

     loveyLR8ZC-855550-69545856608357821   

  8. 「NOIP2014」「LuoguP2296」 寻找道路

    Description 在有向图 G 中,每条边的长度均为 1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 路径上的所有点的出边所指向的点都直接或间接与终点连通. 在 ...

  9. vue中minxin---小记

    定义全局的方法,例如定义过滤器,在很多地方都会用到,就可以定义在minxin中 demo: 数据格式化 保留指定的小数位数 var mixin={ filters:{ fixedNum:functio ...

  10. word-break: break-all word-break:keep-all word-wrap: break-word三者的区别

    word-break属性:指定非CJK脚本的断行规则. 值 描述 normal 使用浏览器默认的换行规则. break-all 允许在单词内换行. keep-all 只能在半角空格或连字符处换行. w ...