java:检测是否可以执行32位或64位应用程序

时间:2014-07-22 10:04:27

标签: java architecture

我有一个可执行文件,可用于32位和64位的Windows,* nix和mac。 所以,我的java应用程序需要检测程序的操作系统和位体系结构,可以运行它们来知道启动哪一个。

我已经搜索了一个解决方案来检测操作系统的位数,jvm等,但我真的没有找到唯一一个在任意操作系统上返回32或64的函数。 另外我发现的答案就像“我认为os.arch应该返回这个,如果可能在某种窗口盒上” - wtf?

问题: 我怎么知道使用Runtime.getRuntime()。exec()肯定会执行哪个应用程序架构?

所以我要求这样的功能:

public int getApplicationArchitecture(){
   if(osCanRun32bit())
       return 32;
   else
       return 64;
}

可以假设使用了类似下面的类(从mkyong.com复制):

public class OSValidator {

private static String OS = System.getProperty("os.name").toLowerCase();

public static void main(String[] args) {
    System.out.println(OS);

    if (isWindows()) {
        System.out.println("This is Windows");
    } else if (isMac()) {
        System.out.println("This is Mac");
    } else if (isUnix()) {
        System.out.println("This is Unix or Linux");
    } else if (isSolaris()) {
        System.out.println("This is Solaris");
    } else {
        System.out.println("Your OS is not support!!");
    }
}

public static boolean isWindows() {
    return (OS.indexOf("win") >= 0);
}

public static boolean isMac() {
    return (OS.indexOf("mac") >= 0);
}

public static boolean isUnix() {
    return (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0 );
}

public static boolean isSolaris() {
    return (OS.indexOf("sunos") >= 0);
}

}

对于此

的任何提示

2 个答案:

答案 0 :(得分:0)

只需从依赖于操作系统的JAVA执行shell命令并检查它的输出。 例如: * Windows:wmic os获得osarchitecture * Linux如:uname -m

答案 1 :(得分:0)

我目前的解决方案如下:

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public static int getApplicationArchitecture(){
    if(isWindows()){
        String arch = System.getenv("PROCESSOR_ARCHITECTURE");
        String wow64Arch = System.getenv("PROCESSOR_ARCHITEW6432");

        if(arch!=null && arch.endsWith("64")){
            return 64;
        }
        if(wow64Arch != null && wow64Arch.endsWith("64")){
            return 64;
        }
    }
    else if(isMac() || isUnix()){
        try{
            Process p = Runtime.getRuntime().exec("uname -m");
            InputStream is = p.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line = br.readLine();
            if(line.indexOf("64")!=-1){
                return 64;
            }
        }catch(Exception e){}
    }

    // on unkown OS
    if(System.getProperty("os.arch").equals("x86")){
        return 32;
    }
    return 64;
}

最后我将检查特定的64位操作系统,如果无法确定,请检查os.arch属性 - 它有点猜测位数

也许有人可以评论或改进