Java には、プロセスまたは .exe ファイルが 32 ビットか 64 ビットかを知ることができる、呼び出す API がありますか? - コードが実行されている JVM ではありません
3 に答える
外部プロセスが 32 ビットか 64 ビットかを判断するための標準 Java API はありません。
これを行うには、ネイティブ コードを使用するか、外部ユーティリティを呼び出してこれを行う必要があります。どちらの場合も、解決策はプラットフォーム固有である可能性があります。考えられる (プラットフォーム固有の) リードは次のとおりです。
(Linux) https://unix.stackexchange.com/questions/12862/how-to-tell-if-a-running-program-is-64-bit-in-linux
(Windows の場合、ソリューションには実行中のプロセスではなく「.exe」ファイルをテストすることが含まれるため、関連する「.exe」ファイルを最初に特定できる必要があることに注意してください ...)
Windows用のJavaでメソッドを作成しました。これは、システム上に存在する必要がない場合と同じヘッダーを調べます(この回答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 + ".");
}
}
main メソッドは以下を出力します。
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.
Java には、プログラムが 32 ビットか 64 ビットかを判別できる標準 API が付属していません。
ただし、Windows では、(プラットフォーム SDK がインストールされていると仮定して) を使用できますdumpbin /headers
。これを呼び出すと、問題のファイルに関するあらゆる種類の情報が得られます。その中には、ファイルが 32 ビットか 64 ビットかに関する情報もあります。出力では、64-bitでは、次のようになります
8664 machine (x64)
32ビットでは、次のようになります。
14C machine (x86)
アプリケーションが 64 ビットかどうかを判断するその他の方法については、SuperUserまたはWindows HPC チームのブログを参照してください。