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



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

392   18  

18 ответов:

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

System.getProperty("os.name")

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

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

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

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

октября. 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
}

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


февраль 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.солнце.в JavaFX.PlatformUtil
  • com.солнце.сми.jfxmediaimpl.HostUtils
  • com.солнце.в JavaFX.утиль.Утилиты

пример:

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

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

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

    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);
    }

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

затем вы можете легко вызвать класс из любого класса следующим образом(P.S. поскольку мы объявили переменную os как статическую, она будет потреблять время только один раз, чтобы определить тип системы, а затем ее можно использовать до тех пор, пока ваше приложение не остановится. )

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

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

Я считаю, что OS Utils от 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
\
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;
    }
}

вы можете просто использовать Солнце.ОУ.OSInfo#getOSType () метод

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

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 Runtime Environment

солнце.сапог.библиотека.path=/usr/lib/jvm / java-1.8.0-openjdk-1.8.0...

java.виртуальная память.версия=25.65-b01

java.виртуальная память.поставщик=Oracle Корпорация

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

путь.разделитель=:

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

file.encoding.pkg=sun.io

пользователей.Страна=США

солнце.Ява.launcher=SUN_STANDARD

солнце.ОС.заплатка.уровень=неизвестно!--3-->

Ява.ВМ.спецификация.имя=виртуальная машина Java Спецификация

пользователей.dir= / web / com / 1502258867_87863

java.во время выполнения.версия=1.8.0_65-b17

java.ОУ.graphicsenv=солнце.ОУ.X11GraphicsEnvironment

java.одобренный.dirs=/usr/lib/jvm / java-1.8.0-openjdk-1.8.0...

ОС.arch=amd64

java. io. tmpdir= / tmp

линии.разделитель=

java.виртуальная память.спецификация.поставщик=Oracle Корпорация

os. name=Linux

солнце.jnu.кодировка=кодировка UTF-8

java.библиотека.path=/home/cg/root/GNUstep/Library / Librari...

Ява.спецификация.имя=платформы Java спецификация API

java.класс.версия=52.0

солнце.управление.компилятор=HotSpot 64-разрядный многоуровневый Корпорация

пользователей.language=en

awt.инструментарий=солнце.ОУ.Х11.XToolkit

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

java.версия=1.8.0_65

java.доб.dirs=/usr/lib/jvm / java-1.8.0-openjdk-1.8.0...

солнце.сапог.класс.path=/usr/lib/jvm / java-1.8.0-openjdk-1.8.0...

java.поставщик=Oracle Корпорация

.разделитель=/

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

солнце.ЦП.эндиан=маленький

sun.io. unicode. encoding=UnicodeLittle

солнце.ЦП.isalist=

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

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

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

Comments

    Ничего не найдено.