Java 標準庫 (JDK 1.5 及之前) 未提供跨平台獲取磁盤空間的 API,開發者常採用三種變通方案:調用系統命令解析輸出、第三方庫 JConfig、JNI 本地方法。JDK 6 引入 File.getFreeSpace()/getTotalSpace()/getUsableSpace() 後,首選標準 API;本文作為歷史技術參考,詳細對比三種傳統方案優劣。
Windows 下執行 dir 解析最後一行剩餘字節數;Linux/Unix 下需改用 df -k 解析。代碼示例 (Windows):
public static long getFreeDiskSpace(String dirName) {
String os = System.getProperty("os.name");
String cmd = (os.equals("Windows NT") || os.equals("Windows 2000"))
? "cmd.exe /c dir " + dirName
: "command.com /c dir " + dirName; // 兼容 Win9x
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line, last = null;
while ((line = in.readLine()) != null) last = line;
p.destroy();
if (last == null) return -1;
// 解析最後一行數字 (去除逗號/點)
last = last.trim().replaceAll("[.,]", "");
for (String token : last.split("\\s+")) {
try { return Long.parseLong(token); } catch (NumberFormatException ignored) {}
}
return -1;
}
缺點:命令輸出格式隨系統語言、版本、本地化設置變化極大,解析極其脆弱;進程啟動開銷大;無法在安全受限環境 (如 Applet、簽名限制) 運行。
FileRegistry.getVolumes() 獲取 DiskVolume 數組,調用 getFreeSpace()、getMaxCapacity()。native long getFreeSpace(String path)。javah 生成 C/C++ 頭文件。GetDiskFreeSpaceEx,Linux 讀取 /proc/mounts + statfs。.dll/.so,配置 java.library.path 載入。適用場景:需獲取極其底層存儲信息 (如 RAID 卷、網絡掛載點、inode 使用率) 且標準 API/第三方庫無法滿足時。
File root = new File("C:\\"); // 或 "/"
long freeBytes = root.getFreeSpace(); // 未分配空間
long totalBytes = root.getTotalSpace(); // 總容量
long usableBytes = root.getUsableSpace(); // 當前用戶可用空間 (考慮配額/權限)
三行代碼跨平台、無依賴、無解析風險。歷史方案僅供維護舊代碼或受限環境 (JDK 1.4-) 參考。