Java 检查Linux中的可用空间

Java 检查Linux中的可用空间,java,diskspace,Java,Diskspace,我使用以下代码检查Linux中的可用空间: public final class EnvironmentCheck { public EnvironmentCheck() { // If the HDD Free Space is less than 200 Megabytes write message HDD is too low if (200 > checkHDDFreeSpace()) { S

我使用以下代码检查Linux中的可用空间:

public final class EnvironmentCheck
{
    public EnvironmentCheck()
    {
        // If the HDD Free Space is less than 200 Megabytes write message HDD is too low
        if (200 > checkHDDFreeSpace())
        {
            System.out.println("*** WARNING Hard Drive free space " + checkHDDFreeSpace() + " Megabytes " + "is too low! ***");
        }

        // If the RAM Free Space is less than 200 Megabytes write message HDD is too low
        if (200 > checkRAMFreeSpace())
        {
            System.out.println("*** WARNING RAM free space " + checkRAMFreeSpace() + " Megabytes " + "is too low! ***");
        }
    }

    public long checkHDDFreeSpace()
    {
        long availableSpace = 0;

        FileSystem fs = FileSystems.getDefault();
        for (FileStore store : fs.getFileStores())
        {
            try
            {
                availableSpace = store.getUsableSpace() / 1024;
                //System.out.println(availableSpace);
            }
            catch (IOException e)
            {
            }
        }
        return availableSpace;
    }

    public long checkRAMFreeSpace()
    {
        return Runtime.getRuntime().freeMemory();
    }
}
由于某些原因,当我在Linux上运行代码时,总是会收到一条消息

*** WARNING Hard Drive free space <some value> Megabytes is too low! **
***警告硬盘可用空间MB太低**
你能帮我纠正我的错误吗


我在Windows上没有看到此消息。

打字错误?如果条件相同,则返回。此外,在windows中,条件的计算结果可能为“200>1”或某个数字等于或小于200。这将导致您无法在windows中看到该消息。只是一个猜测,但您必须进行调试。从改变条件开始

看看你的逻辑:

    for (FileStore store : fs.getFileStores())
            availableSpace = store.getUsableSpace() / 1024;
    }
    return availableSpace;
每次迭代都会获得可用空间,但会覆盖上一次迭代的空间。因此,您得到的是您正在迭代的最后一个文件系统的空间,它的空间很可能不到200毫克


输入一些调试输出,例如在每次迭代时打印出
availableSpace
,肯定会有助于解决这个问题

3件在您的代码中不起作用的事情:

1)
FileStore.getUsableSpace()
返回字节数。如果需要MBs,则需要除以1024*1024,而不仅仅是1024:

availableSpace = store.getUsableSpace() / (1024*1024);
2)
Runtime.freemory()
返回堆当前大小的未使用字节数。堆会动态增长或收缩,并且可能尚未达到其最大大小。如果您想要的是可以分配的字节数,则需要以下内容:

Runtime rt = Runtime.getRuntime();
return rt.maxMemory() - (rt.totalMemory() - rt.freeMemory());
3) 与1相同),如果需要MBs,则需要除以1024*1024:

Runtime rt = Runtime.getRuntime();
long freeMem = rt.maxMemory() - (rt.totalMemory() - rt.freeMemory());
return freeMem / (1024 * 1024);