从java获取Linux发行版
从java中,我得到了操作系统Iam的名称。见以下代码:从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文件的内容。它将为您
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
文件,这似乎是大多数通用软件上通常定义的文件。从这一点开始,我扩展了代码,以包括不同的回退方案,以便在多个平台上获得操作系统版本。-如果发行版符合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”)
…似乎比使用过程和缓冲区读取器的所有内容都要简单。