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 }
现在来解释一下这里发生了什么:
-
if语句只是确定windows版本的条件
-
System.getProperty("os.name")
以stringforms返回os的名字 -
.toLowerCase()
方法使得返回的string小写 -
.contains(String)
方法检查给定的inputstring是否包含在被调用的string中 -
最后一个语句允许除了8.1和10以外的每个操作系统的不同代码,这将需要作为一个块处理:(