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

时间:2010-07-19 15:31:49

标签: java unix

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

list of possible os.name values看来,检测“类Unix”操作系统的快速而肮脏的方法是检查os.name 是否包含“Windows”。给我的误报是操作系统,我的代码不太可能遇到!不过,如果有的话,我很想知道更好的方法。

10 个答案:

答案 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属性。

我能想到的唯一其他事情是:

  1. 使用shell脚本或批处理文件包装器来启动Java应用程序,该应用程序使用-D参数传递给操作系统信息到JVM。虽然给出了你的描述,但这听起来并不可行。

  2. 您可以尝试检查是否存在特定于操作系统的目录。例如,您可以假设目录"/"将始终存在于类Unix系统上,但不会存在于Windows上并执行以下操作:

    if((new file(“/”))。exists()) {    System.out.println(“我在Unix系统上!”); }

  3. 尝试启动特定于Unix的命令行命令,如ls并检查返回码。如果它有效,你就是在类Unix系统上,如果不是你在Windows上。

  4. 所有这些解决方案实际上只是黑客攻击,坦率地说,我并没有真正感受到任何这些解决方案。不幸的是,你可能最喜欢你最初的想法。好玩,嗯?

答案 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;
    }
}