55

在 Java 中,我们可以通过查看 的属性值os.name来知道底层操作系统的名称:System.getProperty("os.name")

对于每个版本的 Windows,它总是返回操作系统的确切名称:Windows XP对于 XP、Windows Vista对于 Vista、Windows 7对于七、Windows 8.1对于 8.1,等等......

问题是:我刚刚使用发布的 Microsoft 更新程序将我的 Windows 8.1 更新到了 Windows 10,而且这个属性似乎仍然存在Windows 8.1

public class OSTest {
  public static void main(String[] args) {
    System.out.println(System.getProperty("os.name"));
  }
}

如何为此创建解决方法?而且,有谁知道如果安装新的 Windows 10 副本,这个问题是否仍然存在——也就是说,这个错误是由 Microsoft 自动更新程序引起的——?

4

5 回答 5

50

这是一个已知问题JDK-8066504,已在即将发布的 Java 8 更新 60 中修复。

原因是GetVersionEx函数自 Windows 8.1 起改变了它的行为。

有多种可能的解决方法,请参阅MSDN 文章

最简单的是 exec cmd.exe /c ver

另一种是查看其中一个系统文件的版本信息,例如kernel32.dll.

于 2015-08-09T23:41:42.790 回答
17

这绝对是一个已知的错误。发生这种情况是因为该属性从Windows API 的源代码中os.name获取其值。然而,GetVersionExGetVersionEx

Windows 8.1 之后的版本可能会更改或不可用

根据微软官方网站。相反,我们将需要使用文件IsWindows10OrGreater中的 Version Helper API 函数versionhelpers.h。您可能已经猜到了,这个文件不是 Java 文件,它是用 C 语言编写的。因此,我们需要以某种迂回的方式包含它。这确实需要很多工作(您需要在 JNI 中编程:/),但本教程将帮助您完成它。此错误日志中显示了另一种解决方案,并且确实需要较少的努力。

于 2015-08-09T23:46:38.737 回答
2

我遇到了同样的问题,使用了以下解决方法:cmd命令“systeminfo”返回“OS Name:”这是操作系统的正确名称,为此编写了以下函数:

private boolean os2k10Check()
{
try{

    Process p = Runtime.getRuntime().exec("systeminfo");        /*Execute cmd command "systeminfo"*/
    BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line;
    while (true) 
    {
        line = r.readLine();
        if (line == null) { break; }
        if(line.contains("OS Name:"))               /*If output contains OS Name and 2010*/
        {
        if(line.contains("2010"))
                return true;
        else
                return false;       
        }
    }
}
catch(Exception e)
    {System.out.println("Platform Type: os2010check: exception"+e);}

return false;
}
于 2019-05-16T14:43:07.653 回答
1

嗯...我不知道它是修复 Windows 10( 10.0.17134.590) 还是 Java 8(1.8.0_171-b11对我来说),但现在它是正确的:os.name给我Windows 10.

此外,如果您不信任它,可以检查os.version. 我有10.0

(顺便说一句,我明白了os.arch:amd64。这是 JVM,而不是 OS。)

于 2019-03-07T10:44:09.923 回答
-23

您也可以使用该.contains()方法并仅检查“windows”字符串可能沿线

if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains(windows version here [xp, 7, 8, etc]))){}

如果您需要 Windows 版本,您可以检查所有版本,然后假设 8.1 或 10 来解决该错误。

if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("xp")){
//code for windows xp }

else if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("vista")){
//code for windows vista

else if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("7")){
//code for windows 7}

else if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("8")){
//code for windows 8}
else if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("8.1")){
//code for both windows 8.1 and 10

}

现在解释这里发生了什么:

  1. if语句只是判断windows版本的条件

  2. System.getProperty("os.name")字符串形式返回操作系统的名称

  3. .toLowerCase()方法使返回的字符串小写

  4. .contains(String)方法检查给定的输入字符串是否包含在正在调用它的字符串中

  5. 最后一条语句允许每个操作系统使用不同的代码,除了需要作为一个块处理的 8.1 和 10 :(

于 2015-08-10T01:56:45.037 回答