2013-08-06 99 views

回答

11

沒有用於確定外部進程是32位還是64位的標準Java API。

如果您想這樣做,您需要使用本機代碼或調用外部實用程序來執行此操作。在這兩種情況下,解決方案可能都是平臺特定的。下面是一些可能的(特定平臺)導致:

(請注意,在在Windows的情況下,解決方案涉及到測試「.exe」文件而不是正在運行的進程,所以你需要能夠首先確定相關的「.exe」文件...)

+0

謝謝Stephen! – Mango

+0

對於Windows,我總是查詢系統環境變量「PROCESSOR_ARCHITECTURE」。如果它返回x86,那麼您正在運行32位Windows。 – TheBlastOne

+0

@TheBlastOne - 但這是解決一個不同的問題......確定什麼架構被用於這個過程。 –

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

+0

感謝您的建議。我已經嘗試過了,它在Visual Studio CMD中有效。 – Mango

1

我爲Windows編寫了一個Java的方法,它看起來像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. 
相關問題