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
}
Теперь, чтобы объяснить, что здесь происходит:
оператор if является условным для определения версии windows
System.getProperty("os.name")
возвращает имя ОС в виде строки.toLowerCase()
метод возвращает строковый регистр.contains(String)
Метод проверяет, содержится ли заданная входная строка в строке, в которую вызываетсяПоследний оператор допускает различный код для каждой ОС, кроме 8.1 и 10, который должен обрабатываться как один блок:(