当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何以编程方式确定Java中的操作系统?》经验,为你挑选了14个好方法。

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



1> Chris Jester..:

您可以使用:

System.getProperty("os.name")

PS您可能会发现此代码很有用:

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

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


nvm发现/sf/ask/17360801/
我正在使用`Windows 10`然而``os.name`给了我`Windows 8.1`.这是为什么?这是从哪里来的?

2> Leif Carlsen..:

如其他答案所示,System.getProperty提供原始数据.但是,Apache Commons Lang组件为java.lang.System提供了一个包装器,它具有SystemUtils.IS_OS_WINDOWS等方便的属性,就像前面提到的Swingx OS util一样.



3> VonC..:

2008年10月:

我建议将其缓存在一个静态变量中:

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的"os.name"for Windows 10? "


完全冗余可能有点苛刻,哈希查找比访问引用更昂贵.这一切都取决于具体情况.
我同意基于OAOO的getOSName函数(曾经且只有一次); 但是,考虑到散列查找的速度,缓存完全是多余的.
我重读了这个答案.如果你要缓存,请缓存`isWindows`,`isUnix`等的值.这样你就可以节省字符串比较时间.
好点...如果你认为这是一个不好的做法,请随意投票;)
@Brian True.我已经相应地编辑了这个非常古老的答案,以便参考最近的答案.

4> Wolfgang Fah..:

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


上面的代码*可能*有区域设置问题,因为它使用了区域设置敏感的toLowerCase().这很重要的地方特别是在将我转换为大/小写时,因为在土耳其,我变成小写未发送i(ı),并且我变成大写点i(İ).所以"WINDOWS".toLowerCase().indexOf("win")将在土耳其返回-1.在执行特定语言的小写时,总是传递语言环境,即"WINDOWS".toLowerCase(Locale.ENGLISH).indexOf("win")将在土耳其工作.
OS.contains(...)
(OS.indexOf("darwin")> = 0)永远不会是真的,因为它来自(OS.indexOf("win")> = 0)

5> Igor Rybak..:

以下JavaFX类具有用于确定当前OS的静态方法(isWindows(),isLinux()...):

com.sun.javafx.PlatformUtil

com.sun.media.jfxmediaimpl.HostUtils

com.sun.javafx.util.Utils

例:

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


请注意,现在不鼓励访问"com/sun/javafx/*"(使用JDK 1.8.0_121进行检查).
我必须再纠正自己一次。从Java 9/10 +开始,将删除几个“ com.sun。*”包/ API。请查看[此链接](https://docs.oracle.com/javase/9​​/migrate/toc.htm#JSMIG-GUID-F7696E02-A1FB-4D5A-B1F2-89E7007D4096)了解更多信息。我实际上偶然发现了这一点,因为我们使用了其中一些软件包。迁移到Eclipse 4.8 / JDK 10时,我们现在必须修复由于缺少引用而导致的这些错误以及其他一些编译器错误。

6> Memin..:

假设您有这样的实用程序函数的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:

等等...



7> 小智..:
    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);
    }



8> Alex Miller..:

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

http://svn.terracotta.org/svn/tc/dso/trunk/code/base/common/src/com/tc/util/runtime/

http://svn.terracotta.org/svn/tc/dso/tags/2.6.4/code/base/common/src/com/tc/util/runtime/

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

http://svn.terracotta.org/svn/tc/dso/trunk/common/src/main/java/com/tc/util/runtime/


当心许可!!
Terracotta课程非常全面!

9> 小智..:

试试这个,简单易行

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



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> Richard Harr..:

我发现Swingx的OS Utils可以完成这项工作.


上面的链接似乎被打破了,可能是由于SwingX引入了分支; 1.6版本在这里:https://swingx.dev.java.net/source/browse/swingx/tags/SwingX-1-6/src/java/org/jdesktop/swingx/util/OS.java?view=标记
最新版本在这里:http://java.net/projects/swingx/sources/svn/content/trunk/swingx-core/src/main/java/org/jdesktop/swingx/util/Utilities.java

12> PAA..:

下面的代码显示了您可以从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
\



13> Nafeez Qurai..:

我认为以下内容可以在更少的行中提供更广泛的覆盖范围

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



14> Vishal Chaud..:
String osName = System.getProperty("os.name");
System.out.println("Operating system " + osName);

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有