6

从 java,我得到了我正在工作的操作系统的名称。见下面的代码:

System.out.println(System.getProperty("os.name"));

在 windows xp 中,它打印如下:Windows XP

但在 ubuntu/fedora 中,它只显示Linux.

任何人都可以帮助我使用 java 代码找到我正在使用的 linux 版本(如 ubuntu 或 fedora)吗?是否可以从 java 中找到 linux 发行版?

4

4 回答 4

5

此代码可以帮助您:

String[] cmd = {
"/bin/sh", "-c", "cat /etc/*-release" };

try {
    Process p = Runtime.getRuntime().exec(cmd);
    BufferedReader bri = new BufferedReader(new InputStreamReader(
            p.getInputStream()));

    String line = "";
    while ((line = bri.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {

    e.printStackTrace();
}

更新

如果您只需要版本,请尝试使用 uname -a

更新

一些 linux 发行版在 /proc/version 文件中包含发行版。这是一个从 java 打印它们而不调用任何 SO 命令的示例

//lists all the files ending with -release in the etc folder
File dir = new File("/etc/");
File fileList[] = new File[0];
if(dir.exists()){
    fileList =  dir.listFiles(new FilenameFilter() {
        public boolean accept(File dir, String filename) {
            return filename.endsWith("-release");
        }
    });
}
//looks for the version file (not all linux distros)
File fileVersion = new File("/proc/version");
if(fileVersion.exists()){
    fileList = Arrays.copyOf(fileList,fileList.length+1);
    fileList[fileList.length-1] = fileVersion;
}       
//prints all the version-related files
for (File f : fileList) {
    try {
        BufferedReader myReader = new BufferedReader(new FileReader(f));
        String strLine = null;
        while ((strLine = myReader.readLine()) != null) {
            System.out.println(strLine);
        }
        myReader.close();
    } catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }
}
于 2013-02-22T07:00:34.663 回答
5

从这里开始,我扩展了代码以包含不同的回退方案,以便在多个平台上获得操作系统版本。

  • Windows 具有足够的描述性,您可以从“os.name”系统属性中获取信息
  • Mac OS:您需要根据版本保留发布名称列表
  • Linux:这是最复杂的,这里是后备列表:
    - 如果发行版符合 LSB,则从 LSB 发行文件中
    获取信息 - 如果 /etc/system-release 存在,则从 /etc/system-release
    获取信息 - 从中​​获取信息/etc/ 中任何以 '-release' 结尾的文件
    - 从 /etc/ 中以 '_version' 结尾的任何文件获取信息(主要用于 Debian)
    - 从 /etc/issue 获取信息(如果存在
    ) - 最坏的情况,获取/proc/version 中的哪些信息可用

  • 您可以在此处获取实用程序类:
    https ://github.com/aurbroszniowski/os-platform-finder

    于 2014-06-09T21:55:08.420 回答
    0

    获取 Linux 发行版名称的一种特别方法是读取/etc/*-release文件的内容。它会给你类似的东西CentOS release 6.3 (Final)

    从 Java 中读取该文件的内容是直截了当的。

    可能不是最好的方法,但它会完成工作,这也只适用于 *nix 盒子而不是 Windows。

    于 2013-02-22T06:59:38.357 回答
    0

    可以用java运行uname -r,得到结果;这通常会显示发行版,除非它是由某个家伙在他的地下室从源头编译的。对于我的机器:

    mao@korhal ~ $ uname -r
    3.4.9-gentoo
    

    并运行它:

    Process p = Runtime.getRuntime().exec("uname -r");  
    BufferedReader in = new BufferedReader(  
                        new InputStreamReader(p.getInputStream()));  
    String distro = in.readLine();  
    
    // Do something with distro and close reader
    

    编辑:对于一般的发行版来说,也许uname -a会更好。或者查看/etc/*-release文件,这似乎是在大多数将军身上普遍定义的。

    于 2013-02-22T07:08:39.400 回答