如何以编程方式确定Java中的操作系统?

时间:2008-10-23 03:47:06

标签: java operating-system

我想确定我的Java程序以编程方式运行的主机的操作系统(例如:我希望能够根据我是在Windows还是Unix平台上加载不同的属性)。 100%可靠性最安全的方法是什么?

21 个答案:

答案 0 :(得分:563)

您可以使用:

System.getProperty("os.name")

P.S。您可能会发现此代码很有用:

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

它所做的就是打印出Java实现提供的所有属性。它将通过属性为您提供有关Java环境的信息。 : - )

答案 1 :(得分:133)

如其他答案所示,System.getProperty提供原始数据。但是,Apache Commons Lang componentwrapper for java.lang.System提供了方便的属性,如SystemUtils.IS_OS_WINDOWS,就像前面提到的Swingx OS util。

答案 2 :(得分:73)

十月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年2月:7年多后:

Windows 10存在错误(原始回答时不存在) 请参阅“Java's “os.name” for Windows 10?

答案 3 :(得分:36)

上面答案中的一些链接似乎被打破了。我在下面的代码中添加了指向当前源代码的指针,并提供了一种处理检查的方法,并将枚举作为答案,以便在评估结果时可以使用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;
  }
}

答案 4 :(得分:33)

以下JavaFX类具有确定当前操作系统的静态方法(isWindows(),isLinux()...):

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

示例:

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

答案 5 :(得分:11)

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

答案 6 :(得分:9)

如果您对开源项目如何做这样的事情感兴趣,可以查看处理此垃圾的Terracotta类(Os.java):

你可以在这里看到一个类似的类来处理JVM版本(Vm.java和VmVersion.java):

答案 7 :(得分:8)

取自此项目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 {
}

答案 8 :(得分:8)

假设您有这样的实用程序函数的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变量声明为静态,它只消耗一次时间来识别系统类型,然后它可以在你的应用程序停止之前使用。)< / p>

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

依旧......

答案 9 :(得分:6)

我发现OS Utils from Swingx完成了这项任务。

答案 10 :(得分:6)

试试这个,简单易行

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

答案 11 :(得分:5)

我认为以下内容可以在更少的行中提供更广泛的报道

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

答案 12 :(得分:4)

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

答案 13 :(得分:2)

如果您在对安全敏感的环境中工作,请通读此书。

请不要再信任通过System#getProperty(String)子例程获得的属性!实际上,几乎所有的属性,包括os.archos.nameos.version都不是只读的,相反,它们实际上恰恰相反。

首先,任何具有足够权限调用System#setProperty(String, String)子例程的代码都可以随意修改返回的文字。但是,这并不一定是这里的主要问题,因为可以通过使用所谓的SecurityManager来解决,如here所述。

实际的问题是,任何用户在运行有问题的JAR时都可以编辑这些属性。这意味着无法确定这些属性是否确实准确。因此,这里有一些其他的检查尝试来避免篡改:

// The first thing we're able to do is to query the filesystem.
switch (java.io.File.separator)
{
    case "/":
        // Windows is a potential candidate.
        break;
    case "\\":
        // And here it could really be anything else.
        break;
    default:
        // There's probably something really wrong here by now.
        break;
}

另一个好主意是检查操作系统特定目录的存在。无论采用哪种方法,请记住, Java 语言被认为是跨平台的。那么,为什么不尝试这样做呢?

答案 14 :(得分:2)

您可以使用sun.awt.OSInfo#getOSType()方法

答案 15 :(得分:2)

我喜欢沃尔夫冈的回答,只因为我相信这样的事情应该是有效的......

所以我为自己改写了一点,并想分享它:)

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

答案 16 :(得分:1)

此代码用于显示有关系统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));
    }
}

答案 17 :(得分:0)

只需使用com.sun.javafx.util.Utils,如下所示。

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

或使用

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

答案 18 :(得分:0)

在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>

否则,只需找到jna库jar文件(例如jna-5.2.0.jar)并将其添加到classpath中即可。

答案 19 :(得分:0)

顶级答案的更短、更简洁(并且热切计算)的版本:

switch(OSType.DETECTED){
...
}

辅助枚举:

public enum OSType {
    Windows, MacOS, Linux, Other;
    public static final  OSType DETECTED;
    static{
        String OS = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH);
        if ((OS.contains("mac")) || (OS.contains("darwin"))) {
            DETECTED = OSType.MacOS;
        } else if (OS.contains("win")) {
            DETECTED = OSType.Windows;
        } else if (OS.contains("nux")) {
            DETECTED = OSType.Linux;
        } else {
            DETECTED = OSType.Other;
        }
    }
}

答案 20 :(得分:0)

由于 google 将“kotlin os name”指向此页面,这里是 @Memin 的 answer 的 Kotlin 版本:

private var _osType: OsTypes? = null
val osType: OsTypes
    get() {
        if (_osType == null) {
            _osType = with(System.getProperty("os.name").lowercase(Locale.getDefault())) {
                if (contains("win"))
                    OsTypes.WINDOWS
                else if (listOf("nix", "nux", "aix").any { contains(it) })
                    OsTypes.LINUX
                else if (contains("mac"))
                    OsTypes.MAC
                else if (contains("sunos"))
                    OsTypes.SOLARIS
                else
                    OsTypes.OTHER
            }
        }
        return _osType!!
    }

enum class OsTypes {
    WINDOWS, LINUX, MAC, SOLARIS, OTHER
}