Java的Windows 10“os.name”?

时间:2015-08-09 21:40:50

标签: java operating-system jvm windows-10 getproperty

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

对于每个版本的Windows,它总是返回操作系统的确切名称:XP为Windows XP,Vista为Windows Vista,Seven为Windows 7Windows 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自动更新程序引起的?

5 个答案:

答案 0 :(得分:41)

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

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

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

琐碎的是执行cmd.exe /c ver

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

答案 1 :(得分:13)

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

  在Windows 8.1之后发布的

可能会被更改或不可用

根据微软的官方网站。相反,我们需要使用IsWindows10OrGreater文件中的Version Helper API函数中的versionhelpers.h。正如您可能猜到的那样,此文件不是Java文件,而是用C语言编写的。因此,我们需要以稍微迂回的方式包含它。它确实需要相当多的工作(你需要在JNI中编程:/),但this tutorial将帮助你做到这一点。另一种解决方案显示在this bug log中,并且确实需要更少的工作量。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

此外,如果您不信任它,则可以选中Windows 10。我有os.version

(顺便说一下,我看到10.0。这是JVM的,而不是OS的。)

答案 4 :(得分:-18)

你也可以使用.contains()方法,只检查“窗口” 字符串可能沿着

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. 返回
  4. .toLowerCase()方法返回String小写

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

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