Как вы определяете 32 или 64-битную архитектуру Windows с помощью Java?
Спасибо.
Как вы определяете 32 или 64-битную архитектуру Windows с помощью Java?
Спасибо.
Обратите внимание, что свойство os.arch
предоставит вам только архитектуру JRE, а не базовые ОС.
Если вы установите 32-разрядную бит в 64-разрядную систему, System.getProperty("os.arch")
вернет x86
Чтобы фактически определить базовую архитектуру, вам нужно будет написать собственный код. См. этот пост для получения дополнительной информации (и ссылки на примерный собственный код)
Я точно не верю, читая системную переменную os.arch. Хотя он работает, если пользователь запускает 64-битную JVM на 64-битной системе. Он не работает, если пользователь запускает 32-битную JVM в 64-разрядной системе.
Следующий код работает для правильного обнаружения 64-разрядных операционных систем Windows. В 64-битной системе Windows переменная среды "Programfiles (x86)" будет установлен. Он НЕ будет установлен в 32-битной системе, а java будет считать его нулевым.
boolean is64bit = false;
if (System.getProperty("os.name").contains("Windows")) {
is64bit = (System.getenv("ProgramFiles(x86)") != null);
} else {
is64bit = (System.getProperty("os.arch").indexOf("64") != -1);
}
Для других операционных систем, таких как Linux или Solaris или Mac, мы также можем увидеть эту проблему. Так что это не полное решение. Для mac вы, вероятно, безопасны, потому что яблоко блокирует JVM для соответствия ОС. Но Linux и Solaris и т.д. Они все еще могут использовать 32-разрядную JVM на своей 64-битной системе. Поэтому используйте это с осторожностью.
Я использовал командную строку (команда → wmic OS get OSArchitecture), чтобы получить архитектуру ОС. Следующая программа помогает получить все необходимые параметры:
import java.io.*;
public class User {
public static void main(String[] args) throws Exception {
System.out.println("OS --> "+System.getProperty("os.name")); //OS Name such as Windows/Linux
System.out.println("JRE Architecture --> "+System.getProperty("sun.arch.data.model")+" bit."); // JRE architecture i.e 64 bit or 32 bit JRE
ProcessBuilder builder = new ProcessBuilder(
"cmd.exe", "/c","wmic OS get OSArchitecture");
builder.redirectErrorStream(true);
Process p = builder.start();
String result = getStringFromInputStream(p.getInputStream());
if(result.contains("64"))
System.out.println("OS Architecture --> is 64 bit"); //The OS Architecture
else
System.out.println("OS Architecture --> is 32 bit");
}
private static String getStringFromInputStream(InputStream is) {
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
String line;
try {
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
}
Вы можете попробовать этот код, я думаю, что лучше обнаружить модель JVM
boolean is64bit = System.getProperty("sun.arch.data.model").contains("64");
Возможно, это не лучший способ, но он работает.
Все, что я делаю, это получить "Enviroment Variable", которые окна настроили для папки Program Files x86. Я имею в виду, что у Windows x64 есть папка (Program Files x86), а x86 - нет. Поскольку пользователь может изменить путь к файлам программ в Enviroment Variables
, или он может сделать каталог "Program Files (x86)" в C: \, я не буду использовать обнаружение папки, но "путь окружения" "Program Files (x86)" с переменной в реестре Windows.
public class getSystemInfo {
static void suckOsInfo(){
// Get OS Name (Like: Windows 7, Windows 8, Windows XP, etc.)
String osVersion = System.getProperty("os.name");
System.out.print(osVersion);
String pFilesX86 = System.getenv("ProgramFiles(X86)");
if (pFilesX86 !=(null)){
// Put here the code to execute when Windows x64 are Detected
System.out.println(" 64bit");
}
else{
// Put here the code to execute when Windows x32 are Detected
System.out.println(" 32bit");
}
System.out.println("Now getSystemInfo class will EXIT");
System.exit(0);
}
}
(Только для Windows) Проверьте, C:\Windows\SysWOW64 существует. если каталог существует, это 64-битный процесс. Кроме того, это 32-битный процесс.
System.getProperty("os.arch");
Вы можете использовать свойство os.arch в свойствах системы, чтобы узнать.
Properties pr = System.getProperties();
System.out.println(pr.getProperty("os.arch"));
Если вы находитесь на 32 бит, он должен показать i386 или что-то