首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 獲取磁盤剩餘空間的三種方案:Runtime.exec、JConfig 與 JNI

     編輯:Java 相關知識

Java 標準庫 (JDK 1.5 及之前) 未提供跨平台獲取磁盤空間的 API,開發者常採用三種變通方案:調用系統命令解析輸出、第三方庫 JConfig、JNI 本地方法。JDK 6 引入 File.getFreeSpace()/getTotalSpace()/getUsableSpace() 後,首選標準 API;本文作為歷史技術參考,詳細對比三種傳統方案優劣。

方案一:Runtime.exec 調用系統命令 (強平台相關)

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、簽名限制) 運行。

方案二:JConfig 跨平台庫 (推薦歷史方案)

  • 官網:https://www.tolstoy.com/samizdat/jconfig.html
  • 核心用法:FileRegistry.getVolumes() 獲取 DiskVolume 數組,調用 getFreeSpace()、getMaxCapacity()。
  • 優點:純 Java 實現 (內部含本地庫),API 統一,屏蔽平台差異。
  • 缺點:項目長期未維護,可能不兼容新 JDK/OS 版本;需打包額外 JAR 與本地庫。

方案三:JNI 自定義本地方法 (終極靈活、開發成本最高)

  1. 編寫 Java 類聲明 native long getFreeSpace(String path)。
  2. javah 生成 C/C++ 頭文件。
  3. 實現平台相關 C 代碼:Windows 調用 GetDiskFreeSpaceEx,Linux 讀取 /proc/mounts + statfs。
  4. 編譯生成 .dll/.so,配置 java.library.path 載入。

適用場景:需獲取極其底層存儲信息 (如 RAID 卷、網絡掛載點、inode 使用率) 且標準 API/第三方庫無法滿足時。

現代最佳實踐 (JDK 6+)

File root = new File("C:\\"); // 或 "/"
long freeBytes = root.getFreeSpace();     // 未分配空間
long totalBytes = root.getTotalSpace();   // 總容量
long usableBytes = root.getUsableSpace(); // 當前用戶可用空間 (考慮配額/權限)

三行代碼跨平台、無依賴、無解析風險。歷史方案僅供維護舊代碼或受限環境 (JDK 1.4-) 參考。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved