How do you determine 32 or 64 bit architecture of Windows using Java?
I don't exactly trust reading the os.arch system variable. While it works if a user is running a 64bit JVM on a 64bit system. It doesn't work if the user is running a 32bit JVM on a 64 bit system.
The following code works for properly detecting Windows 64-bit operating systems. On a Windows 64 bit system the environment variable"Programfiles(x86)" will be set. It will NOT be set on a 32-bit system and java will read it as null.
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);}
For other operating systems like Linux or Solaris or Mac we may see this problem as well. So this isn't a complete solution. For mac you are probably safe because apple locks down the JVM to match the OS. But Linux and Solaris, etc.. they may still use a 32-bit JVM on their 64-bit system. So use this with caution.
Please note, the os.arch
property will only give you the architecture of the JRE, not of the underlying os.
If you install a 32 bit jre on a 64 bit system, System.getProperty("os.arch")
will return x86
In order to actually determine the underlying architecture, you will need to write some native code. See this post for more info (and a link to sample native code)
I used the command prompt (command --> wmic OS get OSArchitecture) to get the OS architecture. The following program helps get all the required parameters:
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(); }}