检查Linux中的可用空间

时间:2014-10-20 21:59:54

标签: 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())
        {
            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! **

你能帮我解决我的错误。

我在Windows上看不到这条消息。

3 个答案:

答案 0 :(得分:1)

在您的代码中无效的3件事:

1)FileStore.getUsableSpace()返回一些字节。如果你想要MB,你需要除以1024 * 1024而不是1024:

availableSpace = store.getUsableSpace() / (1024*1024);

2)Runtime.freeMemory()返回当前大小的的未使用字节数。堆动态增长或收缩,可能未达到最大大小。如果您需要的是可以分配的字节数,则需要以下内容:

Runtime rt = Runtime.getRuntime();
return rt.maxMemory() - (rt.totalMemory() - rt.freeMemory());

3)与1)相同,如果你想要MB,你需要除以1024 * 1024:

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

答案 1 :(得分:0)

错字?你的条件是否相同。此外,在Windows中,条件可能是条件评估为“200> 1”或某个数字等于或小于200.这将导致您从未在Windows中看到该消息。只是猜测,但你必须调试。首先改变条件。

答案 2 :(得分:0)

看看你的逻辑:

    for (FileStore store : fs.getFileStores())
            availableSpace = store.getUsableSpace() / 1024;
    }
    return availableSpace;

您可以在每次迭代时获得可用空间,但是您可以覆盖上一次迭代中的空间。所以你得到了你正在迭代的最后文件系统的空间,这可能只有不到200meg的空间。

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