Как программно определить операционную систему на Java?

StackOverflow https://stackoverflow.com/questions/228477

  •  04-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

System.getProperty("os.name")

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

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

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

Другие советы

Как указано в других ответах, System.getProperty предоставляет необработанные данные. Однако компонент Apache Commons Lang предоставляет Оболочка для java.lang.System с удобными свойствами, такими как < a href = "http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/SystemUtils.html#IS_OS_WINDOWS" rel = "nofollow noreferrer"> SystemUtils.IS_OS_WINDOWS , очень похоже на вышеупомянутую утилиту Swingx OS.

Октябрь.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 существует ошибка (которой не существовало на момент первоначального ответа).
Видеть "Java «os.name» для Windows 10?"

некоторые ссылки в ответах выше не работают. Я добавил указатели к текущему исходному коду в приведенном ниже коде и предлагаю подход для обработки проверки с помощью перечисления в качестве ответа, чтобы можно было использовать оператор 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
 *
 * http://stackoverflow.com/questions/228477/how-do-i-programmatically-determine-operating-system-in-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;
  }
}

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

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

Пример:

if (PlatformUtil.isWindows()){
           ...
}
    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);
    }

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

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

Взято из этого проекта 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 {
}

Допустим, у вас есть класс 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 как статическую, она потребует время только один раз для определения типа системы, затем она может использоваться до тех пор, пока ваше приложение не остановится.)

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

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

Я считаю, что Утилиты ОС из Swingx выполняют свою работу.

Попробуйте это просто и легко

System.getProperty("os.name");
System.getProperty("os.version");
System.getProperty("os.arch");

Ниже код показывает значения, которые вы можете получить из системного API, и все это вы можете получить через этот API.

public class App {
    public static void main( String[] args ) {
        //Operating system name
        System.out.println(System.getProperty("os.name"));

        //Operating system version
        System.out.println(System.getProperty("os.version"));

        //Path separator character used in java.class.path
        System.out.println(System.getProperty("path.separator"));

        //User working directory
        System.out.println(System.getProperty("user.dir"));

        //User home directory
        System.out.println(System.getProperty("user.home"));

        //User account name
        System.out.println(System.getProperty("user.name"));

        //Operating system architecture
        System.out.println(System.getProperty("os.arch"));

        //Sequence used by operating system to separate lines in text files
        System.out.println(System.getProperty("line.separator"));

        System.out.println(System.getProperty("java.version")); //JRE version number

        System.out.println(System.getProperty("java.vendor.url")); //JRE vendor URL

        System.out.println(System.getProperty("java.vendor")); //JRE vendor name

        System.out.println(System.getProperty("java.home")); //Installation directory for Java Runtime Environment (JRE)

        System.out.println(System.getProperty("java.class.path"));

        System.out.println(System.getProperty("file.separator"));
    }
}

Ответы:-

Windows 7
6.1
;
C:\Users\user\Documents\workspace-eclipse\JavaExample
C:\Users\user
user
amd64


1.7.0_71
http://java.oracle.com/
Oracle Corporation
C:\Program Files\Java\jre7
C:\Users\user\Documents\workspace-Eclipse\JavaExample\target\classes
\

Я думаю, что следующее может дать более широкое освещение в меньшее количество строк

import org.apache.commons.exec.OS;

if (OS.isFamilyWindows()){
                //load some property
            }
else if (OS.isFamilyUnix()){
                //load some other property
            }

Подробнее здесь: https: //commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html

String osName = System.getProperty("os.name");
System.out.println("Operating system " + osName);

Мне понравился ответ Вольфганга, просто потому, что я считаю, что такие вещи должны быть неприятными ...

поэтому я немного перефразировал его для себя и подумал поделиться им:)

/**
 * types of Operating Systems
 *
 * please keep the note below as a pseudo-license
 *
 * helper class to check the operating system this Java VM runs in
 * http://stackoverflow.com/questions/228477/how-do-i-programmatically-determine-operating-system-in-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
 */
public enum OSType {
    MacOS("mac", "darwin"),
    Windows("win"),
    Linux("nux"),
    Other("generic");

    private static OSType detectedOS;

    private final String[] keys;

    private OSType(String... keys) {
        this.keys = keys;
    }

    private boolean match(String osKey) {
        for (int i = 0; i < keys.length; i++) {
            if (osKey.indexOf(keys[i]) != -1)
                return true;
        }
        return false;
    }

    public static OSType getOS_Type() {
        if (detectedOS == null)
            detectedOS = getOperatingSystemType(System.getProperty("os.name", Other.keys[0]).toLowerCase());
        return detectedOS;
    }

    private static OSType getOperatingSystemType(String osKey) {
        for (OSType osType : values()) {
            if (osType.match(osKey))
                return osType;
        }
        return Other;
    }
}

Вы можете просто использовать метод sun.awt.OSInfo # getOSType ()

Этот код для отображения всей информации о типе операционной системы, имени, java-информации и т. д.

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Properties pro = System.getProperties();
    for(Object obj : pro.keySet()){
        System.out.println(" System  "+(String)obj+"     :  "+System.getProperty((String)obj));
    }
}

В классе com.sun.jna.Platform вы можете найти полезные статические методы, такие как

Platform.isWindows();
Platform.is64Bit();
Platform.isIntel();
Platform.isARM();

и многое другое.

Если вы используете Maven, просто добавьте зависимость

<dependency>
 <groupId>net.java.dev.jna</groupId>
 <artifactId>jna</artifactId>
 <version>5.2.0</version>
</dependency>

В противном случае просто найдите jar-файл библиотеки jna (например, jna-5.2.0.jar) и добавьте его в classpath.

Просто используйте com.sun.javafx.util.Utils , как показано ниже.

if ( Utils.isWindows()){
     // LOGIC HERE
}

ИЛИ ИСПОЛЬЗОВАТЬ

boolean isWindows = OSInfo.getOSType().equals(OSInfo.OSType.WINDOWS);
       if (isWindows){
         // YOUR LOGIC HERE
       }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top