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

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

Ответ 1

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

System.getProperty("os.name")

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

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

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

Ответ 3

Октябрь 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?

Ответ 4

System.getProperty("os.name")

Ответ 5

некоторые из ссылок в вышеприведенных ответах кажутся нарушенными. Я добавил указатели на текущий исходный код в приведенном ниже коде и предлагаю подход для обработки проверки с перечислением в качестве ответа, чтобы оператор 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;
  }
}

Ответ 6

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

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

Пример:

if (PlatformUtil.isWindows()){
           ...
}

Ответ 7

Да, краткий ответ - использовать System.getProperty("os.name"). Но почему бы не создать служебный класс, сделать его многоразовым! И, вероятно, намного быстрее на несколько звонков. Чисто, понятно, быстрее!

Создайте класс 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:

и это все!

Ответ 8

    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

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

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

Ответ 10

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

Ответ 11

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

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

Ответ 12

Я обнаружил, что OS Utils из Swingx выполняет эту работу.

Ответ 13

Ниже код показывает значения, которые вы можете получить из System 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
\

Ответ 14

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

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.

Ответ 15

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

Ответ 16

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

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

/**
 * 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;
    }
}

Ответ 17

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

Ответ 18

Этот код для отображения всей информации о системе os типа, имени, 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));
    }
}

Ответ 19

Вы можете получить имя типа ОС, используя

System.out.println(System.getProperty("os.name"));

Вы можете получить всю информацию, связанную с ОС, с помощью:

public class MyFirstJavaProgram {

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

Он выведет очень много деталей

- свойства списка -

java.runtime.name = среда выполнения OpenJDK

sun.boot.library.path =/USR/Library/JVM/Java-1.8.0-OpenJDK-1.8.0...

java.vm.version = 25,65-B01

java.vm.vendor = Корпорация Oracle

java.vendor.url = http://java.oracle.com/

path.separator =

java.vm.name = OpenBDK 64-разрядный сервер VM

file.encoding.pkg = sun.io

user.country = США

sun.java.launcher = SUN_STANDARD

sun.os.patch.level = неизвестен

java.vm.specification.name = спецификация виртуальной машины Java

user.dir =/веб/ком/1502258867_87863

java.runtime.version = 1.8.0_65-b17

java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment

java.endorsed.dirs =/USR/Library/JVM/Java-1.8.0-OpenJDK-1.8.0...

os.arch = amd64

java.io.tmpdir =/TMP

line.separator =

java.vm.specification.vendor = Корпорация Oracle

os.name = Linux

sun.jnu.encoding = UTF-8

java.library.path =/дом/CG/корень/GNUstep/Library/Librari...

java.specification.name = Спецификация API платформы Java

java.class.version = 52,0

sun.management.compiler = 64-разрядные многоуровневые компиляторы HotSpot

os.version = 3.10.0-327.4.4.el7.x86_64

user.home =/USR/доли/HTTPD

user.timezone =

java.awt.printerjob = sun.print.PSPrinterJob

file.encoding = UTF-8

java.specification.version = 1,8

user.name = апаша

java.class.path =/дом/CG/корень/GNUstep/Library/Librari...

java.vm.specification.version = 1,8

sun.arch.data.model = 64

java.home =/USR/Library/JVM/Java-1.8.0-OpenJDK-1.8.0...

sun.java.command = MyFirstJavaProgram

java.specification.vendor = Корпорация Oracle

user.language = еп

awt.toolkit = sun.awt.X11.XToolkit

java.vm.info = смешанный режим

java.version = 1.8.0_65

java.ext.dirs =/USR/Library/JVM/Java-1.8.0-OpenJDK-1.8.0...

sun.boot.class.path =/USR/Library/JVM/Java-1.8.0-OpenJDK-1.8.0...

java.vendor = Корпорация Oracle

File.separator =/

java.vendor.url.bug = http://bugreport.sun.com/bugreport/

sun.cpu.endian = мало

sun.io.unicode.encoding = UnicodeLittle

sun.cpu.isalist =

Ответ 20

Все вышеприведенные ответы могут привести к фатальному недостатку в дизайне подпрограммы System#getProperty!

Никогда, никогда не доверяйте свойствам os.name, os.version и os.arch. Эти свойства на самом деле не предназначены только для чтения, как и следовало ожидать - вместо этого злоумышленник может легко вставить произвольный строковый литерал в них!

Например, на моем компьютере с Windows 10 следующий фрагмент кода фактически выведет строковый литерал "Linux", выполнив следующие действия:

public static void main(String[] args)
{
     System.out.println(System.getProperty("os.name");
}

Теперь, после упаковки class в исполняемый файл JAR, мы можем продолжать и выполнять его, как показано ниже.

$ java -jar PATH.jar -Dos.name="Linux"

Таким образом, все ответы, приведенные выше, могут поставить под угрозу вашу программу, полагая, что она выполняется в совершенно неправильной ОС. Вы можете спросить себя сейчас, как можно решить эту проблему? Ну, на данный момент единственный способ исправить этот упущение - это вручную проверить параметры JVM во время выполнения.

Вот краткий пример того, как запросить эти свойства программно. Предположим, что вы добавили бы блок инициализации static к первичному class. Тогда следующий фрагмент кода будет препятствовать внешнему вмешательству свойства os.name.

if (java.util.Arrays.toString(jdk.internal.misc.VM.getRuntimeArguments()).contains("Dos.name"))
{
    throw new java.lang.InternalError("Please refrain from tampering with the \"os.name\" property.");
}

jdk.internal.misc.VM class не предназначен для использования public. Следовательно, вы не должны использовать его в рабочем коде!

Ответ 21

В классе 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.

Ответ 22

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

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

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

boolean isWindows = OSInfo.getOSType().equals(OSInfo.OSType.WINDOWS);
       if (isWindows){
         // YOUR LOGIC HERE
       }