Подтвердить что ты не робот

Как определить 32 или 64-битную архитектуру Windows с использованием Java?

Как вы определяете 32 или 64-битную архитектуру Windows с помощью Java?

Спасибо.

4b9b3361

Ответ 1

Обратите внимание, что свойство os.arch предоставит вам только архитектуру JRE, а не базовые ОС.

Если вы установите 32-разрядную бит в 64-разрядную систему, System.getProperty("os.arch") вернет x86

Чтобы фактически определить базовую архитектуру, вам нужно будет написать собственный код. См. этот пост для получения дополнительной информации (и ссылки на примерный собственный код)

Ответ 2

Я точно не верю, читая системную переменную 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-битной системе. Поэтому используйте это с осторожностью.

Ответ 3

Я использовал командную строку (команда → 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();

    }

}

Ответ 4

Вы можете попробовать этот код, я думаю, что лучше обнаружить модель JVM

boolean is64bit = System.getProperty("sun.arch.data.model").contains("64");

Ответ 5

Возможно, это не лучший способ, но он работает.

Все, что я делаю, это получить "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);

    }

}

Ответ 6

(Только для Windows) Проверьте, C:\Windows\SysWOW64 существует. если каталог существует, это 64-битный процесс. Кроме того, это 32-битный процесс.

Ответ 7

System.getProperty("os.arch");

Ответ 8

Вы можете использовать свойство os.arch в свойствах системы, чтобы узнать.

Properties pr = System.getProperties();
System.out.println(pr.getProperty("os.arch"));

Если вы находитесь на 32 бит, он должен показать i386 или что-то