一個計算文件夾大小的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
我們下面再使用ls命令查看一下:
很容易看出,各個文件的大小之和剛好等於上面程序的輸出結果,並且也和右鍵屬性中看到的基本一致。
接下來,使用Linux專門查看文件佔用空間大小的du命令來查看一下:
怎麼會是六千多,爲什麼相差這麼多呢?這讓我非常的不解,又仔細看了下du的手冊頁,也沒有發現任何問題。難道du命令存在BUG?
經過簡單的搜索,我在這個鏈接裏看到,已經有人提交了這個BUG。原來如此,看來需要更新一下手頭的coreutils了。
OK,這就是我說的該程序的附加作用,意外地發現了du命令存在的BUG:)