我有一个可执行文件,可用于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);
}
}
对于此
的任何提示答案 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属性 - 它有点猜测位数
也许有人可以评论或改进