一个计算文件夹大小的Java小程序

一个计算文件夹大小的Java小程序

转载自:深度思索点击打开链接

今天,在论坛上看到有人求推荐一个可以方便计算文件夹大小的软件。原因也很简单,毕竟每次都使用鼠标右键查看属性不够方便。其实,对于这样的软件是否存在,以及存在的是否好用,我并没有关心。我忽然想到,这个功能似乎比较容易实现,于是就简单尝试了一下,给出了一个Java小程序,解决这个有趣的问题。
下面是源代码:

/**
 * @file DirectorySize.java
 * A simple program to calculate the size of a directory.
 * @author Jason http://www.zhangliancheng.com
 * @date Tue Mar  8 13:59:21 CST 2011
 */
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
 
public class DirectorySize
{
    public static void main(String[] args) throws IOException
    {
        File dir = new File(".");
        long size = getSize(dir);
        System.out.println(size + " bytes");
    }
 
    /**
     * @para directory the size of which to calculate
     * @return long the size of the diretory in bytes
     */
    public static long getSize(File directory) throws IOException
    {
        File[] files = directory.listFiles();
        long size = 0;
 
        for (File f : files)
        {
            if (f.isDirectory())
                size += getSize(f);
            else
            {
                FileInputStream fis = new FileInputStream(f);
                size += fis.available();
                fis.close();
            }
        }
        return size;
    }
}


最初写的时候,上面的34到38行只有简简单单的一行:

size += new FileInputStream.available();

这样初看起来似乎没有什么问题,但是在当前目录有很多文件和目录的时候,运行就会弹出
异常,并提示open too many files,原来是忘记关闭而超过所能打开的最大数目的限制了>

修改成现在的样子就好了,来来来,看一下运行效果吧:

$ javac DirectorySize.java
$ java DirectorySize
736286003 bytes

呵呵,比较懒啊,没进行单位换算,单位还是比较小的字节。

这个程序不仅有这个基本功能,还带来一点不错的“副作用”,下面我们来验证其运行结果。
首先,我们新建一个测试目录,加入一些文件使之有一定大小,然后用这个程序看看目录目前总容量:

$ java DirectorySize
2107 bytes

然后,我们打开文件管理器,右键看一下该目录的属性:
DirectorySize

我们下面再使用ls命令查看一下:

ls

很容易看出,各个文件的大小之和刚好等于上面程序的输出结果,并且也和右键属性中看到的基本一致。

接下来,使用Linux专门查看文件占用空间大小的du命令来查看一下:

$ du --version
du (GNU coreutils) 7.4
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
Torbjörn Granlund, David MacKenzie, Paul Eggert, and
There is NO WARRANTY, to the extent permitted by law.   Written by Jim Meyering. $ du -sb
6203 .


怎么会是六千多,为什么相差这么多呢?这让我非常的不解,又仔细看了下du的手册页,也没有发现任何问题。难道du命令存在BUG?
经过简单的搜索,我在这个链接里看到,已经有人提交了这个BUG。原来如此,看来需要更新一下手头的coreutils了。
OK,这就是我说的该程序的附加作用,意外地发现了du命令存在的BUG:)

发布了9 篇原创文章 · 获赞 2 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章