如何以编程方式确定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):
-
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):
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 =