如何在Java中检测类Unix操作系统?

mlu*_*own 31 java unix

好的,我知道这System.getProperty("os.name")会给我我正在运行的操作系统的名称,但这不是很多帮助.我需要知道的是,如果我运行的操作系统是一个类似Unix的操作系统,我不关心它是HP-UX,AIX,Mac OS X还是其他什么.

可能的os.name值列表看起来像检测"类Unix"操作系统正在检查是否一个快速和肮脏的方式os.name没有包含的"Windows".给我的误报是操作系统,我的代码不太可能遇到!不过,如果有的话,我很想知道更好的方法.

Pas*_*ent 33

使用org.apache.commons.lang.SystemUtilsCommons Lang 的实用程序类,它有一个很好的IS_OS_UNIX常量.来自javadoc:

true如果这是一个POSIX compilant系统,在任何AIX,HP-UX,IRIX的Linux,MacOSX的,Solaris或SUN OS的.

如果OS_NAME为空,则该字段将返回false.

测试成为:

if (SystemUtils.IS_OS_UNIX) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

简单,有效,易于阅读,没有神秘的技巧.


Dav*_*ski 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
    } 
Run Code Online (Sandbox Code Playgroud)

基本上,通过检测Windows来检测类Unix.


Mik*_*keD 17

File.listRoots() 将为您提供一个文件系统根目录的数组.

如果你是一个类Unix系统,那么数组应该包含一个条目"/",在Windows系统上你会得到类似的东西["C:", "D:", ...]

编辑: @chris_l:我完全忘记了手机.一些挖掘出现了Android返回"/\0\0"- 斜线后跟两个空字节(假设是一个错误).看起来我们暂时通过运气和巧合避免误报.遗憾的是,无法在其他手机上找到好的数据.

无论如何在台式机和手机上运行相同的代码可能不是一个好主意,但有趣的是要知道.看起来它需要检查特定功能而不仅仅是系统类型.

  • 我一直在写Java多年,我从来没有注意到这个功能存在.太好了! (2认同)

sta*_*ker 9

Javadoc说:在UNIX系统上,这个*字段的值是'/'; 在Microsoft Windows系统上它是'\'.

System.out.println( File.separatorChar == '/' ? "Unix" : "Windows" );
Run Code Online (Sandbox Code Playgroud)

  • @Jesper:几乎可以肯定没有,但那不是重点.你是**积极**,没有其他分隔符在使用,更重要的是,从来没有?做这样的事情充满了危险,而你将会遇到问题. (2认同)

小智 6

System.getProperty("os.name"); 是关于你将获得的最好的.