2013-02-10 2 views
3

Как определить, как долго (в миллисекундах) компьютер включен?Получить работоспособность системы в Java

+3

что зависит от ОС, но вы, вероятно, захотите выдать команду – mre

+1

какой ОС? .. никак без внешней сторонней библиотеки или JNI. –

+0

или посмотрите http://www.mkyong.com/java/how-do-get-time-in-milliseconds-in-java/ –

ответ

1

Я не могу думать о зависимом от ОС способе сделать это. Опция должна была бы использовать ManagementFactory.getRuntimeMXBean().getUptime(); Что возвращает ваше время автономной работы JVM, поэтому не совсем то, что вы ищете, но уже шаг в правильном направлении.

Что именно вы пытаетесь выполнить с данными?

+0

в какой тип данных возвращается? Я ищу систему, вошедшую вовремя для использования в моем приложении, чтобы предупредить пользователей о том, что система не была отключена в течение определенных часов. пожалуйста, обновите код, если есть. спасибо – JavDev

+0

@JavDev возвращает количество миллисекунд безотказной работы как длинный –

9

В Windows вы можете выполнить команду net stats srv, а в Unix вы можете выполнить команду uptime. Каждый выход должен анализироваться для получения времени безотказной работы. Этот метод автоматически выполняет необходимую команду, обнаруживая операционную систему пользователя.

Обратите внимание, что ни одна операция не возвращает время безотказной работы в миллисекунду точности.

public static long getSystemUptime() throws Exception { 
    long uptime = -1; 
    String os = System.getProperty("os.name").toLowerCase(); 
    if (os.contains("win")) { 
     Process uptimeProc = Runtime.getRuntime().exec("net stats srv"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(uptimeProc.getInputStream())); 
     String line; 
     while ((line = in.readLine()) != null) { 
      if (line.startsWith("Statistics since")) { 
       SimpleDateFormat format = new SimpleDateFormat("'Statistics since' MM/dd/yyyy hh:mm:ss a"); 
       Date boottime = format.parse(line); 
       uptime = System.currentTimeMillis() - boottime.getTime(); 
       break; 
      } 
     } 
    } else if (os.contains("mac") || os.contains("nix") || os.contains("nux") || os.contains("aix")) { 
     Process uptimeProc = Runtime.getRuntime().exec("uptime"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(uptimeProc.getInputStream())); 
     String line = in.readLine(); 
     if (line != null) { 
      Pattern parse = Pattern.compile("((\\d+) days,)? (\\d+):(\\d+)"); 
      Matcher matcher = parse.matcher(line); 
      if (matcher.find()) { 
       String _days = matcher.group(2); 
       String _hours = matcher.group(3); 
       String _minutes = matcher.group(4); 
       int days = _days != null ? Integer.parseInt(_days) : 0; 
       int hours = _hours != null ? Integer.parseInt(_hours) : 0; 
       int minutes = _minutes != null ? Integer.parseInt(_minutes) : 0; 
       uptime = (minutes * 60000) + (hours * 60000 * 60) + (days * 6000 * 60 * 24); 
      } 
     } 
    } 
    return uptime; 
} 
+0

Это не работает в течение первого часа безотказной работы. – KerrM

+0

Протестировал его на mac – KerrM

+0

@ KerrM Мой плохой, не замечая ваших комментариев раньше, как-то! На Mac, какой формат вывода на первый час? Я фактически написал часть OSX/Linux этого метода, полностью основанную на документации, поскольку у меня нет простого доступа к любому типу ОС. – Vulcan

2

Для окон вы можете получить uptime к точности миллисекунды, запрашивая windows WMI

Чтобы запустить код, приведенный ниже, вам нужно будет загрузить Jawin библиотеку и добавить jawin.dll к вашему затмений корня проекта

public static void main(String[] args) throws COMException { 
    String computerName = ""; 
    String userName = ""; 
    String password = ""; 
    String namespace = "root/cimv2"; 

    String queryProcessor = "SELECT * FROM Win32_OperatingSystem"; 

    DispatchPtr dispatcher = null; 

    try { 

     ISWbemLocator locator = new ISWbemLocator(
       "WbemScripting.SWbemLocator"); 
     ISWbemServices wbemServices = locator.ConnectServer(computerName, 
       namespace, userName, password, "", "", 0, dispatcher); 
     ISWbemObjectSet wbemObjectSet = wbemServices.ExecQuery(
       queryProcessor, "WQL", 0, null); 
     DispatchPtr[] results = new DispatchPtr[wbemObjectSet.getCount()]; 
     IUnknown unknown = wbemObjectSet.get_NewEnum(); 
     IEnumVariant enumVariant = (IEnumVariant) unknown 
       .queryInterface(IEnumVariant.class); 

     enumVariant.Next(wbemObjectSet.getCount(), results); 

     for (int i = 0; i < results.length; i++) { 
      ISWbemObject wbemObject = (ISWbemObject) results[i] 
        .queryInterface(ISWbemObject.class); 

      System.out.println("Uptime: " 
        + wbemObject.get("LastBootUpTime")); 
     } 
    } catch (COMException e) { 
     e.printStackTrace(); 
    } 
Смежные вопросы