好的,我知道System.getProperty("os.name")
会给我我正在运行的操作系统的名称,但这不是很多帮助。我需要知道的是,如果我运行的操作系统是一个类似Unix的操作系统,我不关心它是HP-UX,AIX,Mac OS X还是其他什么。
从list of possible os.name values看来,检测“类Unix”操作系统的快速而肮脏的方法是检查os.name
不是否包含“Windows”。给我的误报是操作系统,我的代码不太可能遇到!不过,如果有的话,我很想知道更好的方法。
答案 0 :(得分:33)
使用Commons Lang的org.apache.commons.lang.SystemUtils
实用程序类,它有一个很好的IS_OS_UNIX
常量。来自javadoc:
如果这是POSIX编译器,则为
true
系统,如AIX,HP-UX,Irix中的任何一个, Linux,MacOSX,Solaris或SUN OS。如果是OS_NAME,该字段将返回false 是空的。
测试成为:
if (SystemUtils.IS_OS_UNIX) {
...
}
简单,有效,易于阅读,没有神秘的技巧。
答案 1 :(得分:19)
我在Windows XP,Vista,Win7,Mac OS 10.3 - 10.6以及各种Linux发行版的生产代码中使用了您的方案而没有任何问题:
if (System.getProperty("os.name").startsWith("Windows")) {
// includes: Windows 2000, Windows 95, Windows 98, Windows NT, Windows Vista, Windows XP
} else {
// everything else
}
基本上,通过不检测Windows来检测类似Unix的。
答案 2 :(得分:17)
File.listRoots()
将为您提供文件系统根目录的数组。
如果您使用的是类Unix系统,那么该数组应该包含一个条目"/"
,而在Windows系统上,您将获得类似["C:", "D:", ...]
编辑: @chris_l:我完全忘记了手机。一些挖掘出现Android返回"/\0\0"
- 斜线后跟两个空字节(假设是一个错误)。看起来我们暂时通过运气和巧合避免误报。遗憾的是,无法在其他手机上找到好的数据。
无论如何在台式机和手机上运行相同的代码可能不是一个好主意,但有趣的是要知道。看起来需要检查特定功能而不仅仅是系统类型。
答案 3 :(得分:9)
Javadoc说:在UNIX系统上的价值
*字段为'/'
;在Microsoft Windows系统上,它是'\'
。
System.out.println( File.separatorChar == '/' ? "Unix" : "Windows" );
答案 4 :(得分:6)
System.getProperty("os.name");
是关于你将获得的最好的。
答案 5 :(得分:1)
我同意@Fuzzy,因为我认为Java希望您能够获取该信息的唯一方法是通过os.name
属性。
我能想到的唯一其他事情是:
使用shell脚本或批处理文件包装器来启动Java应用程序,该应用程序使用-D
参数传递给操作系统信息到JVM。虽然给出了你的描述,但这听起来并不可行。
您可以尝试检查是否存在特定于操作系统的目录。例如,您可以假设目录"/"
将始终存在于类Unix系统上,但不会存在于Windows上并执行以下操作:
if((new file(“/”))。exists()) { System.out.println(“我在Unix系统上!”); }
尝试启动特定于Unix的命令行命令,如ls
并检查返回码。如果它有效,你就是在类Unix系统上,如果不是你在Windows上。
所有这些解决方案实际上只是黑客攻击,坦率地说,我并没有真正感受到任何这些解决方案。不幸的是,你可能最喜欢你最初的想法。好玩,嗯?
答案 6 :(得分:1)
使用File.pathSeparator或File.separator。第一个将返回“;”在Windows中,在Unix中使用“:”。第二个将在Windows中返回“\”,在Unix中返回“/”。
答案 7 :(得分:0)
这是一个非常古老的问题,但你仍然可以使用它:System.getProperty("os.name").toLowerCase();
答案 8 :(得分:-1)
您可以尝试执行uname
命令 - 应该可以在所有unixoid系统上使用。
答案 9 :(得分:-2)
package com.appspot.x19290;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class UnixCheck {
public static void main(String[] args) {
UnixCheck s = UnixCheck.S;
String isUnix = s.unix ? "is Unix" : "not Unix";
try {
System.out.println(isUnix + ", devnull: " + s.devnull.getPath());
} catch (NullPointerException e) {
System.out.println(isUnix + ", devnull: unknown");
}
}
public static final UnixCheck S = new UnixCheck();
public static final UnixCheck TEST = new UnixCheck(true);
public final boolean unix;
public final File devnull;
private UnixCheck() {
this(false);
}
private UnixCheck(boolean testing) {
String path;
path = testing ? "/<dev>/<no><such><null><device>" : "/dev/null";
File devnull = devnullOrNone(path);
if (devnull == null) {
this.unix = false;
path = testing ? "<no><such><null><device>" : "nul";
this.devnull = devnullOrNone(path);
} else {
this.unix = true;
this.devnull = devnull;
}
}
private static File devnullOrNone(String name) {
File file = new File(name);
if (file.isFile())
return null;
if (file.isDirectory())
return null;
try {
FileInputStream i = new FileInputStream(file);
try {
i.read();
} finally {
i.close();
}
} catch (IOException e) {
return null;
}
return file;
}
}