2009-07-15 62 views
3

我需要在Java 5(或1.5,無論)中查找驅動器的總大小。我知道Java 6在java.io.File中有一個新方法,但我需要它在Java 5中工作。在Java中查找總磁盤大小的便攜方法(java 6之前)

Apache Commons IO有org.apache.commons.io.FileSystemUtils提供免費磁盤空間,但不是總磁盤空間。

我意識到這是依賴於操作系統,將需要依賴凌亂的命令行調用。我很喜歡它在「最」系統上工作,例如windows/linux/macosx。最好我想使用現有的庫,而不是編寫自己的變體。

有什麼想法?謝謝。

回答

4

更新:

我對誤讀的問題道歉,我建議複製FileSystemUtils的方法,但修改它稍微運行的命令。

在DOS下你可以用fsutil命令的自由和總字節數:

fsutil volume diskfree [drive letter] 

在我的箱子此得出以下結果:

Total # of free bytes  : 41707524096 
Total # of bytes    : 80023715840 
Total # of avail free bytes : 41707524096 

在Unix上,命令仍然「 df -k「,你只是對」Free「左邊的」1024-blocks「列感興趣(例如下面的維基百科)。你顯然需要乘以1024的結果。

Filesystem 1024-blocks  Free %Used Iused %Iused Mounted on 
/dev/hd4   32768  16016 52%  2271 14%/
/dev/hd2   4587520 1889420 59% 37791  4% /usr 
/dev/hd9var   65536  12032 82%  518  4% /var 
/dev/hd3   819200 637832 23%  1829  1% /tmp 
/dev/hd1   524288 395848 25%  421  1% /home 
/proc     -   - -   -  - /proc 
/dev/hd10opt  65536  26004 61%  654  4% /opt 

假設你複製FileSystemUtils實行 「totalSpaceKB()」 委託給一個等效比OS-方法。用於Windows的實現將是這樣的(注意使用「查找」從FSUTIL調整輸出只得到總規模):

​​

用於Unix的實施將是相同的freeSpaceUnix()的,但在該方法

/** comment these two lines so the token received is the total size */ 
    tok.nextToken(); // Ignore 1K-blocks 
    tok.nextToken(); // Ignore Used 
    /** this will now be the total size */ 
    String freeSpace = tok.nextToken(); 
    return parseBytes(freeSpace, path); 
} 

其他平臺的實現將是相似的端部除去兩次調用tok.nextToken()。

希望這有助於並理解誤解問題。


原始答案(獲得可用字節數,不是總數)。

在Java 6之前,沒有一種優雅的方式可以做到這一點(請參閱bug)。我建議使用一個庫來爲您執行特定於平臺的處理,而不是自己動手。

Apache commons-io有一個FileSystemUtils類型,它提供了一個靜態方法freeSpaceKb()。它適用於Windows和一些Unix實現(請參閱下面的Javadoc報價)

從的Javadoc:

公共靜態長freeSpaceKb(字符串路徑) 拋出IOException異常

在返回的自由空間調用命令行以千字節爲單位的驅動器或卷。 FileSystemUtils.freeSpaceKb(「C:」); // Windows FileSystemUtils.freeSpaceKb(「/ volume」); // * nix

可用空間通過命令行進行計算。它在Windows上使用'dir/-c',在AIX/HP-UX上使用'df -kP',在其他Unix上使用'df -k'。 爲了工作,您必須運行Windows,或者在傳遞-k(或-kP)時有一個支持GN​​U格式的Unix df實現。如果您要依賴此代碼,請通過運行一些簡單的測試來比較命令行與此類的輸出來檢查它是否適用於您的操作系統。如果您的操作系統不受支持,請提出JIRA調用,詳細介紹df -k的確切結果以及儘可能多的其他細節,謝謝。

+0

我在問題中提到的Apache的commons-io的。我正在尋找* total *磁盤空間。 – 2009-08-10 10:21:52

1

注:該解決方案建議只作爲最後掙扎的企圖

我不知道這是否存在任何API /庫。但是,作爲最後一次嘗試我可能會創建一個Ant腳本或使用Ant任務實現來執行適用於該平臺的OS命令,然後解析輸出流。爲什麼是Ant? - 因爲它提供了:

  • 良好平臺標識(見os condition
  • 平臺獨立command execution
  • 能力以編程方式解析從命令執行輸出 - 由輸出寫入屬性,然後從Ant訪問該project對象。

是的,這有點麻煩,但是你可以使用Ant API執行目標,然後用你自己的界面包裝它。這仍然不一定涵蓋所有可能的系統 - 只有Ant可以識別的系統。

此外,它仍然是一個公平的工作,您需要爲所有目標平臺制定正確的命令和解析策略。

再次 - 最後一次嘗試 - 等待其他答案並繼續搜索其他庫和API產品。

0

Here在SUN存在自由磁盤空間問題的悠久歷史。 他們提到JConfig作爲一種可能的解決方案。不幸的是,這個圖書館只能在2009年夏天(希望)達到目前尚不清楚是否它解決了原來的問題,因爲文檔和源代碼不可用,但他們聲明:

它可以讓你與標準Java類 庫提供的文件,瀏覽器,進程,文件類型和 其他系統級項目一起使用的更高級的方式比使用 更高級的方式。例如,您可以使用 啓動Web瀏覽器或其他 外部應用程序,而不是使用 Runtime.exec或只有 在一個平臺上工作的解決方案。

所以,如果你有耐心和幸運......