Java "os.name" для Windows 10?

В Java мы можем увидеть значение свойства os.name знать имя базовой операционной системы: System.getProperty("os.name"),

Для каждой редакции Windows всегда возвращалось точное имя ОС: Windows XP для XP, Windows Vista для Vista, Windows 7 для семи, Windows 8.1 для 8.1 и так далее...

Проблема в том, что я только что обновил свою Windows 8.1 до Windows 10 с помощью выпущенного средства обновления Microsoft, и кажется, что это свойство все еще остается Windows 8.1:

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

Как я могу создать обходной путь для этого? И кто-нибудь знает, сохраняется ли эта проблема при установке новой копии Windows 10 - то есть эта ошибка вызвана автообновлением Microsoft -?

3 ответа

Решение

Это известная проблема JDK-8066504, которая была исправлена ​​в грядущем обновлении Java 8 60.

Причина в том, что функция GetVersionEx изменила свое поведение после Windows 8.1.

Есть несколько возможных обходных путей, см. Статью MSDN.

Тривиально, чтобы исполнить cmd.exe /c ver,

Другой - посмотреть информацию о версии одного из системных файлов, например kernel32.dll,

Это определенно известная ошибка. Это происходит потому, что os.name свойство получает свою стоимость от GetVersionEx в исходном коде Windows API. GetVersionEx тем не мение,

может быть изменено или недоступно для выпусков после Windows 8.1

Согласно официальному сайту Microsoft. Вместо этого нам нужно будет использовать IsWindows10OrGreater в функциях API-помощника по версии в versionhelpers.h файл. Как вы, наверное, догадались, этот файл не является Java-файлом, он написан на C. В результате мы должны включить его несколько окольным путем. Это займет довольно много времени (вам нужно программировать на JNI:/), но это руководство поможет вам это сделать. Другое решение показано в этом журнале ошибок и требует меньше усилий.

Я столкнулся с той же проблемой, использовал следующий обходной путь: Команда cmd "systeminfo" возвращает "Имя ОС:", которое является правильным именем для ОС, написал следующую функцию для этого:

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

Хм... я не знаю, это исправление 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, а не из ОС.)

Вы также можете использовать .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, который должен обрабатываться как один блок:(

Другие вопросы по тегам