使用Java或C正确获取操作系统信息#

使用Java或C正确获取操作系统信息#,java,operating-system,registry,Java,Operating System,Registry,我想使用java或C获得操作系统名称和版本,如下例所述: 示例:Microsoft Windows 8.1企业版 我试过以下方法: 在java中尝试了System.getProperty(“os.name”) =>它不提供操作系统版本 一种方法是从注册表中获取操作系统名称 从\HKLM\SOFTWARE\Microsoft\windowsnt\CurrentVersion 我还尝试了SYSTEMINFO命令,它提供了操作系统名称。但由于它显示不同的语言输出。无法从输出中检查变量名 但我想找到一种

我想使用java或C获得操作系统名称和版本,如下例所述:

示例:Microsoft Windows 8.1企业版

我试过以下方法:

  • 在java中尝试了
    System.getProperty(“os.name”)
    =>它不提供操作系统版本

  • 一种方法是从注册表中获取操作系统名称 从
    \HKLM\SOFTWARE\Microsoft\windowsnt\CurrentVersion

  • 我还尝试了SYSTEMINFO命令,它提供了操作系统名称。但由于它显示不同的语言输出。无法从输出中检查变量名

  • 但我想找到一种方法,而不是从注册表中查找,这样即使在未来版本的操作系统中,注册表路径发生变化,应用程序也应该提供正确的操作系统名称


    有没有其他可靠的方法可以通过edition查找操作系统名称?

    查看apache commons lang库-操作系统名称、操作系统名称、操作系统版本 也许它能找回你需要的东西。以下是其javadocs的链接:

    最后我使用了下面的代码,因为我分析了注册表路径很可能不会更改

        private final String STR_OS_NAME_REGISTRY_QUERY = "reg query \"HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\" /v \"ProductName\"";     
    
        // Get OS name
            objProcessName = Runtime.getRuntime().exec(STR_OS_NAME_REGISTRY_QUERY); 
            objProcessName.waitFor(); 
            objBufferReader = new BufferedReader(new InputStreamReader(objProcessName.getInputStream())); 
            lstJavaInfo = new ArrayList<>();
    
            while ((sLine = objBufferReader.readLine()) != null)
            {
                lstJavaInfo.add(sLine);
            }
            objProcessName.waitFor();
    
            if(lstJavaInfo.size() < 3)
            {
                return "-";
            }
    
            String[] sarr = lstJavaInfo.get(2).split("\\s+");
            for(int nIndex = 3 ; nIndex < sarr.length ; nIndex++)
            {
                sOSArchitecture = sOSArchitecture + sarr[nIndex] + " ";
            }
    
    private final String STR\u OS\u NAME\u REGISTRY\u QUERY=“reg QUERY\”HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\“/v\'ProductName\”;
    //获取操作系统名称
    objProcessName=Runtime.getRuntime().exec(STR\u OS\u NAME\u REGISTRY\u QUERY);
    objprocessiname.waitFor();
    objBufferReader=new BufferedReader(新的InputStreamReader(objProcessName.getInputStream());
    lstJavaInfo=newarraylist();
    而((sLine=objBufferReader.readLine())!=null)
    {
    lstJavaInfo.add(sLine);
    }
    objprocessiname.waitFor();
    if(lstJavaInfo.size()<3)
    {
    返回“-”;
    }
    字符串[]sarr=lstJavaInfo.get(2).split(\\s+);
    对于(int-nIndex=3;nIndex
    在Java中,不是真的,不是。。。除非某个地方的某个人开发了一个本地库,涵盖了每种可能的情况。我意识到这并不是更好,但是
    systeminfo/nh/fo csv
    总是(我认为)将操作系统名称作为第二个逗号分隔的值输出。至少它不依赖于特定于区域设置的标题。除了链接到资源之外,您还可以提供简短的注释-只需链接它的非常规样式