从java获取Linux发行版

从java获取Linux发行版,java,operating-system,linux-distro,Java,Operating System,Linux Distro,从java中,我得到了操作系统Iam的名称。见以下代码: System.out.println(System.getProperty("os.name")); 在windows xp中,它的打印方式如下:windows xp 但在ubuntu/fedora中,它只显示Linux 有谁能帮我找到Iam使用java代码的linux版本(如ubuntu或fedora)?可以从java中找到linux发行版吗?获取linux发行版名称的一种特殊方法是读取/etc/*-release文件的内容。它将为您

从java中,我得到了操作系统Iam的名称。见以下代码:

System.out.println(System.getProperty("os.name"));
在windows xp中,它的打印方式如下:
windows xp

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


有谁能帮我找到Iam使用java代码的linux版本(如ubuntu或fedora)?可以从java中找到linux发行版吗?

获取linux发行版名称的一种特殊方法是读取
/etc/*-release
文件的内容。它将为您提供类似于CentOS 6.3版(最终版)的内容

从Java中读取此文件的内容非常简单。


可能不是最好的方法,但它可以完成工作,而且这只在*nix-box上有效,在windows上无效。

此代码可以帮助您:

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());
    }
}

您可以使用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
文件,这似乎是大多数通用软件上通常定义的文件。

从这一点开始,我扩展了代码,以包括不同的回退方案,以便在多个平台上获得操作系统版本。
  • Windows具有足够的描述性,您可以从“os.name”系统属性获取信息
  • Mac OS:您需要根据版本保留一个发布名称列表
  • Linux:这是最复杂的,下面是回退列表:
    -如果发行版符合LSB,则从LSB发行文件获取信息
    -从/etc/系统版本获取信息(如果存在)
    -从/etc/
    中以“-release”结尾的任何文件中获取信息 -从/etc/(主要用于Debian)中以“\u version”结尾的任何文件中获取信息
    -从/etc/issue(如果存在)获取信息
    -最坏情况下,从/proc/version获取可用信息

  • 您可以在此处获得实用程序类:



    试试
    os.version
    。我运行Windows&不确定它在*nix上返回什么。
    os.version
    只返回
    3.2.0-23-generic-pae
    。如何识别发行版?请务必添加@BrianRoach(或任何人)以通知他们新的评论。顺便说一句,这有什么关系?用户已经知道他们有哪个Linux发行版(如果他们真想知道的话)和应用程序。很少需要这样的信息。通过了解这些信息,您试图提供什么功能?读取mariadb配置文件的功能位于不同的位置。要获取此文件,我需要linux发行版。似乎这只适用于RedHat派生的发行版。不知何故,我不认为官方Ubuntu服务器发行版是由某个人在他的地下室编译的:
    2.6.38-13-server
    ;)@BrianRoach是否有一个环境变量可以定义路径?@andreThompson-指向什么的路径?@BrianRoach My bad。隐藏在注释中的是“读取mariadb配置文件的Its位于不同位置”。我指的是该位置的路径。其输出也与
    os.version
    相同。为什么需要运行
    进程来读取文件?为什么不直接用Java打开文件呢?这只是一个方便的问题。您必须列出并读取所有的*-release文件。
    if(file.getName().endsWith(“-release”)
    …似乎比使用
    过程和
    缓冲区读取器的所有内容都要简单。