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


当前回答

因为谷歌点“kotlin os名称”到这个页面,这里是@Memin的答案的kotlin版本:

private var _osType: OsTypes? = null
val osType: OsTypes
    get() {
        if (_osType == null) {
            _osType = with(System.getProperty("os.name").lowercase(Locale.getDefault())) {
                if (contains("win"))
                    OsTypes.WINDOWS
                else if (listOf("nix", "nux", "aix").any { contains(it) })
                    OsTypes.LINUX
                else if (contains("mac"))
                    OsTypes.MAC
                else if (contains("sunos"))
                    OsTypes.SOLARIS
                else
                    OsTypes.OTHER
            }
        }
        return _osType!!
    }

enum class OsTypes {
    WINDOWS, LINUX, MAC, SOLARIS, OTHER
}

其他回答

试试这个,简单易行

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

你可以使用:

System.getProperty("os.name")

附注:你可能会发现这段代码很有用:

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

它所做的就是打印出Java实现提供的所有属性。它将使您了解通过属性可以了解Java环境的哪些信息。: -)

以下JavaFX类有静态方法来确定当前的操作系统(isWindows(),isLinux()…):

com.sun.javafx.PlatformUtil com.sun.media.jfxmediaimpl.HostUtils com.sun.javafx.util.Utils

例子:

if (PlatformUtil.isWindows()){
           ...
}

如果您正在安全敏感的环境中工作,那么请通读本文。

请不要相信通过system# getProperty(String)子例程获得的属性!实际上,几乎所有的属性包括os。Arch, os.name和os.name。版本并不是你所期望的只读的——相反,它们实际上恰恰相反。

首先,任何具有调用system# setProperty(String, String)子例程足够权限的代码都可以随意修改返回的文字。然而,这并不一定是这里的主要问题,因为它可以通过使用所谓的SecurityManager来解决,如这里更详细的描述。

实际的问题是,任何用户都可以在运行JAR时编辑这些属性(通过-Dos.name=, -Dos.name=, -Dos.name=)。拱=,等等)。避免篡改应用程序参数的一种可能方法是查询RuntimeMXBean,如下所示。下面的代码片段应该提供一些关于如何实现这一点的见解。

RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();

for (String argument : arguments) {
    if (argument.startsWith("-Dos.name") {
        // System.getProperty("os.name") altered
    } else if (argument.startsWith("-Dos.arch") {
        // System.getProperty("os.arch") altered
    }
}

此代码用于显示有关系统操作系统类型、名称、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));
    }
}