如何在Java中确定另一个进程或可执行文件是32位还是64位

时间:2013-08-06 00:25:41

标签: java 32bit-64bit

Java是否有任何可以调用的API,可以知道进程或.exe文件是32位还是64位? - 不是运行代码的JVM

3 个答案:

答案 0 :(得分:11)

没有标准的Java API来确定外部进程是32位还是64位。

如果您想这样做,您可能需要使用本机代码,或者调用外部实用程序来执行此操作。在这两种情况下,解决方案可能都是平台特定的。以下是一些可能的(特定于平台的)潜在客户:

(请注意,在Windows情况下,解决方案涉及测试“.exe”文件而不是正在运行的进程,因此您需要首先确定相关的“.exe”文件...)

答案 1 :(得分:1)

Java没有任何标准API可以让您确定程序是32位还是64位。

但是,在Windows上,您可以使用(假设您安装了平台SDK)dumpbin /headers。调用此方法将产生有关该文件的各种信息,其中包含有关该文件是32位还是64位的信息。在输出中,在 64位上,您可以使用

8664 machine (x64)

32位上,您会得到类似

的内容
14C machine (x86)

您可以详细了解determining if an application is 64-bit on SuperUserThe Windows HPC Team Blog的其他方式。

答案 2 :(得分:1)

我在Java for Windows中编写了一个方法,该方法查看与dumpbin相同的标题,而不必在系统上(基于this answer)。

/** 
 * 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.