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

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

您可以使用:

System.getProperty("os.name") 

PS你可能会发现这个代码有用:

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

它所做的只是打印出Java实现提供的所有属性。 它会给你一个你可以通过属性findJava环境的想法。 🙂

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

2008年10月:

我build议将其caching在一个静态variables中:

 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有一个错误(在原始答案时不存在)。
请参阅“ 用于Windows 10的Java的”os.name“?

 System.getProperty("os.name") 

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

如果你对开源项目如此感兴趣,你可以在这里看看处理这个垃圾的Terracotta类(Os.java):

你可以在这里看到一个类似的类来处理JVM版本(Vm.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); } 

假设你有一个Util类用于这样的效用函数。 然后为每个操作系统types创build公共枚举。

 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由于我们声明osvariables是静态的,所以只需要一次的时间来识别系统types,那么它可以被使用,直到你的应用程序暂停。

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

等等…

我发现来自Swingx的OS Utils完成了这项工作。

从这个项目采取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 { } 

试试这个,简单又容易

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

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

此代码用于显示有关系统的所有信息ostypes,名称,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)); } } 

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

您可以使用获取操作系统types名称

 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 / lib中/ JVM / java的1.8.0-的openjdk-1.8.0 …

java.vm.version = 25.65-B01

java.vm.vendor = Oracle Corporation

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

path.separator =:

java.vm.name = OpenJDK 64位服务器虚拟机

file.encoding.pkg = sun.io

user.country = US

sun.java.launcher = SUN_STANDARD

sun.os.patch.level =未知

java.vm.specification.name = Java虚拟机规范

user.dir来= /networking/ COM / 1502258867_87863

java.runtime.version = 1.8.0_65-B17

java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment

java.endorsed.dirs = / usr / lib中/ JVM / java的1.8.0-的openjdk-1.8.0 …

os.arch = AMD64

java.io.tmpdir = / TMP

line.separator =

java.vm.specification.vendor = Oracle Corporation

os.name = Linux的

sun.jnu.encoding = UTF-8

的java.library.path = /家庭/ CG /根/ GNUstep的/库/ Librari …

java.specification.name = Java平台API规范

java.class.version = 52.0

sun.management.compiler = HotSpot 64位分层编译器

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 = apache的

java.class.path = /家庭/ CG /根/ GNUstep的/库/ Librari …

java.vm.specification.version = 1.8

sun.arch.data.model = 64

java.home = / usr / lib中/ JVM / java的1.8.0-的openjdk-1.8.0 …

sun.java.command = MyFirstJavaProgram

java.specification.vendor = Oracle公司

user.language = EN

awt.toolkit = sun.awt.X11.XToolkit

java.vm.info =混合模式

java.version = 1.8.0_65

java.ext.dirs = / usr / lib中/ JVM / java的1.8.0-的openjdk-1.8.0 …

sun.boot.class.path = / usr / lib中/ JVM / java的1.8.0-的openjdk-1.8.0 …

java.vendor = Oracle Corporation

文件分割符= /

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

sun.cpu.endian =小

sun.io.unicode.encoding = UnicodeLittle

sun.cpu.isalist =