Как определить в Java, является ли другой процесс или исполняемый файл 32-разрядной или 64-разрядной

Есть ли в Java какой-либо API для вызова, который может узнать, является ли процесс или файл .exe 32-разрядным или 64-битным? - не JVM, в котором работает ваш код.

Ответ 1

Нет стандартного API Java для определения того, является ли внешний процесс 32 или 64 бит.

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

(Обратите внимание, что в случаях Windows решение включает тестирование файла ".exe", а не выполняющегося процесса, поэтому вам нужно сначала определить соответствующий файл ".exe"...)

Ответ 2

В Java нет стандартного API, который позволяет определить, является ли программа 32-разрядной или 64-разрядной.

В Windows, однако, вы можете использовать (при условии, что вы установили SDK платформы) dumpbin /headers. Вызов этого даст всю информацию о файле, о котором идет речь, о том, является ли файл 32-разрядным или 64-битным. В выводе на 64-разрядной вам будет что-то вроде

8664 machine (x64)

В 32-бит вы получите что-то вроде

14C machine (x86)

Вы можете узнать больше о других способах определения, является ли приложение 64-разрядным в SuperUser или на Блог группы HP HPC.

Ответ 3

Я написал метод в Java для Windows, который смотрит на те же заголовки, что и dumpbin, не имея его в системе (на основе этого ответа),

/** 
 * Reads the .exe file to find headers that tell us if the file is 32 or 64 bit.
 * 
 * Note: Assumes byte pattern 0x50, 0x45, 0x00, 0x00 just before the byte that tells us the architecture.
 * 
 * @param filepath fully qualified .exe file path.
 * @return true if the file is a 64-bit executable; false otherwise.
 * @throws IOException if there is a problem reading the file or the file does not end in .exe.
 */
public static boolean isExeFile64Bit(String filepath) throws IOException {
    if (!filepath.endsWith(".exe")) {
        throw new IOException("Not a Windows .exe file.");
    }

    byte[] fileData = new byte[1024]; // Should be enough bytes to make it to the necessary header.
    try (FileInputStream input = new FileInputStream(filepath)) {
        int bytesRead = input.read(fileData);
        for (int i = 0; i < bytesRead; i++) {
            if (fileData[i] == 0x50 && (i+5 < bytesRead)) {
                if (fileData[i+1] == 0x45 && fileData[i+2] == 0 && fileData[i+3] == 0) {
                    return fileData[i+4] == 0x64;
                }
            }
        }
    }

    return false;
}

public static void main(String[] args) throws IOException {
    String[] files = new String[] {
            "C:/Windows/system32/cmd.exe",                           // 64-bit
            "C:/Windows/syswow64/cmd.exe",                           // 32-bit
            "C:/Program Files (x86)/Java/jre1.8.0_73/bin/java.exe",  // 32-bit
            "C:/Program Files/Java/jre1.8.0_73/bin/java.exe",        // 64-bit
            };
    for (String file : files) {
        System.out.println((isExeFile64Bit(file) ? "64" : "32") + "-bit file: " + file + ".");
    }
}

Основной метод выводит следующее:

64-bit file: C:/Windows/system32/cmd.exe. 
32-bit file: C:/Windows/syswow64/cmd.exe. 
32-bit file: C:/Program Files (x86)/Java/jre1.8.0_73/bin/java.exe. 
64-bit file: C:/Program Files/Java/jre1.8.0_73/bin/java.exe.