Как программно определить операционную систему на Java? - PullRequest
458 голосов
/ 23 октября 2008

Я бы хотел определить операционную систему хоста, на котором моя Java-программа работает программно (например: я хотел бы иметь возможность загружать различные свойства в зависимости от того, нахожусь ли я на платформе Windows или Unix). Какой самый безопасный способ сделать это со 100% надежностью?

Ответы [ 18 ]

564 голосов
/ 23 октября 2008

Вы можете использовать:

System.getProperty("os.name")

P.S. Вы можете найти этот код полезным:

class ShowProperties {
    public static void main(String[] args) {
        System.getProperties().list(System.out);
    }
}

Все, что он делает, это распечатывает все свойства, предоставляемые вашими реализациями Java. Это даст вам представление о том, что вы можете узнать о вашей среде Java через свойства. : -)

133 голосов
/ 27 мая 2010

Как указано в других ответах, System.getProperty предоставляет необработанные данные. Тем не менее, компонент Apache Commons Lang предоставляет оболочку для java.lang.System с удобными свойствами, такими как SystemUtils.IS_OS_WINDOWS, очень похожими на вышеупомянутую утилиту Swingx OS.

74 голосов
/ 23 октября 2008

Октябрь 2008

Я бы рекомендовал кэшировать его в статической переменной:

public static final class OsUtils
{
   private static String OS = null;
   public static String getOsName()
   {
      if(OS == null) { OS = System.getProperty("os.name"); }
      return OS;
   }
   public static boolean isWindows()
   {
      return getOsName().startsWith("Windows");
   }

   public static boolean isUnix() // and so on
}

Таким образом, каждый раз, когда вы запрашиваете Os, вы не получаете свойство более одного раза в течение срока действия вашего приложения.


Февраль 2016: 7+ лет спустя:

В Windows 10 имеется ошибка (которая не существовала на момент первоначального ответа).
Смотрите «« os.name »Java для Windows 10? »

36 голосов
/ 24 августа 2013

некоторые ссылки в ответах выше не работают. Я добавил указатели к текущему исходному коду в приведенном ниже коде и предлагаю подход для обработки проверки с помощью перечисления в качестве ответа, чтобы можно было использовать оператор switch при оценке результата:

OsCheck.OSType ostype=OsCheck.getOperatingSystemType();
switch (ostype) {
    case Windows: break;
    case MacOS: break;
    case Linux: break;
    case Other: break;
}

Вспомогательный класс:

/**
 * helper class to check the operating system this Java VM runs in
 *
 * please keep the notes below as a pseudo-license
 *
 * /219321/kak-programmno-opredelit-operatsionnuy-sistemu-na-java
 * compare to http://svn.terracotta.org/svn/tc/dso/tags/2.6.4/code/base/common/src/com/tc/util/runtime/Os.java
 * http://www.docjar.com/html/api/org/apache/commons/lang/SystemUtils.java.html
 */
import java.util.Locale;
public static final class OsCheck {
  /**
   * types of Operating Systems
   */
  public enum OSType {
    Windows, MacOS, Linux, Other
  };

  // cached result of OS detection
  protected static OSType detectedOS;

  /**
   * detect the operating system from the os.name System property and cache
   * the result
   * 
   * @returns - the operating system detected
   */
  public static OSType getOperatingSystemType() {
    if (detectedOS == null) {
      String OS = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH);
      if ((OS.indexOf("mac") >= 0) || (OS.indexOf("darwin") >= 0)) {
        detectedOS = OSType.MacOS;
      } else if (OS.indexOf("win") >= 0) {
        detectedOS = OSType.Windows;
      } else if (OS.indexOf("nux") >= 0) {
        detectedOS = OSType.Linux;
      } else {
        detectedOS = OSType.Other;
      }
    }
    return detectedOS;
  }
}
33 голосов
/ 16 декабря 2016

Следующие классы JavaFX имеют статические методы для определения текущей ОС (isWindows (), isLinux () ...):

  • com.sun.javafx.PlatformUtil
  • com.sun.media.jfxmediaimpl.HostUtils
  • com.sun.javafx.util.Utils

Пример:

if (PlatformUtil.isWindows()){
           ...
}
11 голосов
/ 06 июля 2013
    private static String OS = System.getProperty("os.name").toLowerCase();

    public static void detectOS() {
        if (isWindows()) {

        } else if (isMac()) {

        } else if (isUnix()) {

        } else {

        }
    }

    private static boolean isWindows() {
        return (OS.indexOf("win") >= 0);
    }

    private static boolean isMac() {
        return (OS.indexOf("mac") >= 0);
    }

    private static boolean isUnix() {
        return (OS.indexOf("nux") >= 0);
    }
9 голосов
/ 23 октября 2008

Если вам интересно, как проект с открытым исходным кодом делает подобные вещи, вы можете проверить класс Terracotta (Os.java), который обрабатывает этот мусор, здесь:

И вы можете увидеть похожий класс для обработки версий JVM (Vm.java и VmVersion.java) здесь:

8 голосов
/ 21 июля 2015

Допустим, у вас есть класс Util для таких служебных функций. Затем создайте публичные перечисления для каждого типа операционной системы.

public class Util {     
        public enum OS {
            WINDOWS, LINUX, MAC, SOLARIS
        };// Operating systems.

    private static OS os = null;

    public static OS getOS() {
        if (os == null) {
            String operSys = System.getProperty("os.name").toLowerCase();
            if (operSys.contains("win")) {
                os = OS.WINDOWS;
            } else if (operSys.contains("nix") || operSys.contains("nux")
                    || operSys.contains("aix")) {
                os = OS.LINUX;
            } else if (operSys.contains("mac")) {
                os = OS.MAC;
            } else if (operSys.contains("sunos")) {
                os = OS.SOLARIS;
            }
        }
        return os;
    }
}

Затем вы можете легко вызывать класс из любого класса следующим образом (PS Поскольку мы объявили переменную os как static, она потребует время только один раз для определения типа системы, затем она может использоваться до тех пор, пока ваше приложение не остановится.) 1004 *

            switch (Util.getOS()) {
            case WINDOWS:
                //do windows stuff
                break;
            case LINUX:

и так далее ...

8 голосов
/ 13 мая 2015

взято из этого проекта https://github.com/RishiGupta12/serial-communication-manager

String osName = System.getProperty("os.name");
String osNameMatch = osName.toLowerCase();
if(osNameMatch.contains("linux")) {
    osType = OS_LINUX;
}else if(osNameMatch.contains("windows")) {
    osType = OS_WINDOWS;
}else if(osNameMatch.contains("solaris") || osNameMatch.contains("sunos")) {
    osType = OS_SOLARIS;
}else if(osNameMatch.contains("mac os") || osNameMatch.contains("macos") || osNameMatch.contains("darwin")) {
    osType = OS_MAC_OS_X;
}else {
}
6 голосов
/ 23 октября 2008

Я считаю, что ОС Utils из Swingx делает свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...