2014-10-20 3 views
-1

Я использую этот код, чтобы проверить наличие свободного пространства в Linux:Проверить свободное пространство в 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.

ответ

1

3 вещи, которые не работают в вашем коде:

1) FileStore.getUsableSpace() возвращает количество байтов . Если вы хотите мегабайтов, вам нужно разделить на 1024 * 1024, а не только 1024:

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

2) Runtime.freeMemory() возвращает количество неиспользованных байт для текущего размера кучи. Куча растет или сжимается динамически и, возможно, не достигла своего максимального своих . Если то, что вы хотите, это число байтов, которые могут быть выделены, вам необходимо следующее:

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

3) так же, как для 1), если вы хотите мегабайты, вам нужно разделить на 1024 * 1024:

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

Typo? Условия, если вы идентичны. Кроме того, в Windows это может означать, что условие оценивается как «200> 1» или некоторое число, равное или меньше 200. Это приведет к тому, что вы никогда не увидите сообщение в окнах. Просто догадайтесь, но вам придется отлаживать. Начните с изменения условий.

0

Посмотрите на вашу логику:

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

Вы получаете доступное пространство на каждой итерации, но вы ПЕРЕЗАПИШЕТЕ пространство от предыдущей итерации. Таким образом, вы получаете пространство файловой системы LAST, которое вы выполняете, что может иметь менее 200 мегабайт пространства.

Ввод некоторых отладочных выходов, например. распечатка availableSpace на итерации, определенно поможет понять это.

Смежные вопросы