Java的“os.name”为Windows 10?

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

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

问题是:我只是使用发布的微软更新程序将Windows 8.1更新到Windows 10,而且似乎仍然保留Windows 8.1

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

我怎样才能为此创build一个解决方法? 而且,有没有人知道如果这个问题仍然存在,如果安装新的Windows 10副本 – 也就是说,这个错误是由微软自动更新引起的?

这是在即将到来的Java 8更新60中已经修复的已知问题JDK-8066504 。

原因是自Windows 8.1以来, GetVersionEx函数已经改变了它的行为。

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

微不足道的是执行cmd.exe /c ver

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

这绝对是一个已知的错误。 这是因为os.name属性从Windows API的源代码中的GetVersionEx中获取它的值。 GetVersionEx然而,

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

根据微软的官方网站。 相反,我们需要使用versionhelpers.h文件中Version Helper API函数中的versionhelpers.h 。 正如你可能猜到的那样,这个文件不是Java文件,而是用C语言编写的。因此,我们需要把它包含在一个有些迂回的方式中。 这需要相当多的工作(你需要用JNI编程:/),但是本教程将帮助你做到这一点。 在这个错误日志中显示了另一个解决scheme,并且需要更less的努力。

你也可以使用.contains()方法,只需要检查“windows”string

 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")以stringforms返回os的名字

  3. .toLowerCase()方法使得返回的string小写

  4. .contains(String)方法检查给定的inputstring是否包含在被调用的string中

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