文件中的 JDK11 getFreeSpace 和 getTotalSpace 与 df 不匹配

JDK11 getFreeSpace and getTotalSpace from File is not matching df

我看到 df -h 输出如下

root@vrni-platform:/var/lib# df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/vg-var            110G   94G   11G  91% /var
root@vrni-platform:/var/lib# df -k
Filesystem                   1K-blocks     Used Available Use% Mounted on
/dev/mapper/vg-var           114756168 98318504  10585300  91% /var

但是如果我从 java 像下面那样做同样的事情

final File dataPath = new File("/var");
final long totalBytes = dataPath.getTotalSpace();
final long usedBytes = totalBytes - dataPath.getFreeSpace();
System.out.printf("Disk utilization: %.2f, Total bytes: %d, Used Bytes: %d", ((double)usedBytes/totalBytes * 100), totalBytes, usedBytes);```

打印如下

Disk utilization: 85.68, Total bytes: 117510316032, Used Bytes: 100678909952

谁能告诉我为什么磁盘利用率会出现这种差异?

环境

正如我在评论中也提到的,主要原因是 getFreeSpace 似乎报告了 DF 'Avail' 或 'Available' 之外的其他内容。通过 DF'1K-b​​locks' 和 'Used',你也得到 85.68% 的百分比,而通过'1K-b​​locks' 和 'Available' 得到 91%。还要观察 DF 'Used' 和 'Available'(以及 'Used' 和 'Avail')如何加起来不等于“1K 块”(或 'Size')

根据 user16320675, using getUsableSpace might be a better method to use than getFreeSpace. As to the reasons for the difference between '1K-blocks' - 'Used' and 'Available' in df, it might be better to ask that on https://unix.stackexchange.com/ 的建议。