【问题标题】:Check if Windows XP or later in Java?检查 Windows XP 或更高版本是否使用 Java?
【发布时间】:2013-09-02 00:38:29
【问题描述】:

检查运行我的 Java 应用程序的操作系统是 Windows XP 或更高版本的最简单方法是什么?

编辑:我知道System.getProperty("os.name"),但我不知道检查正在运行的 Windows 版本的最佳方法和/或最有效方法。理想情况下,我还想让它成为未来的证明,这样如果发布了另一个版本的 Windows,我就不需要更改代码。

【问题讨论】:

  • 检查System.getProperty("os.name")
  • @BackSlash 这是唯一的方法吗?如果是这样,我怎样才能使 if 语句尽可能短,而不是有大量的条件。
  • @Andy 使用正则表达式。例如,匹配Windows (?:XP|Vista|7|8)
  • 我希望将来也有办法证明它,所以我宁愿检查操作系统是否不是 XP 或更高版本
  • 那么您希望能够获得某种操作系统版本号吗?

标签: java windows operating-system detect


【解决方案1】:

mkyong给出了教程:http://www.mkyong.com/java/how-to-detect-os-in-java-systemgetpropertyosname/

它依赖于System.getProperty("os.name")

【讨论】:

  • 哇,您一定已经过了几毫秒就无法发布答案了
  • 这只是确定操作系统是否是Windows,而不是哪个版本
  • @Andy 在我的系统上,os.name 属性显示为Windows 8
  • @Andy:使用"os.version",解析它,并与windows versions比较,你可能会得到更好的结果
  • 虽然这可能有助于确定是否有人在运行 Windows,但确定 Windows 版本是否高于特定版本是没有用的。对于特定版本,我建议使用 System.getProperty("os.version") 属性。下面提供了更详细的答案。
【解决方案2】:

由于 Windows 可靠地将其版本信息报告为 float,因此可以通过了解每个 Windows 版本并进行比较来计算“XP 或更高版本”。

速记:

// Is this XP or higher?
// Well, XP Reports as 5.1 (32-bit) or 5.2 (64-bit).  All higher OSs use a higher version
final boolean XP_OR_HIGHER = (Float.parseFloat(System.getProperty("os.version")) >= 5.1f);

但是由于解析系统值可能引发异常,再加上 XP 已停产这一事实,并且更有可能有人正在寻找更新的操作系统比较......这里有一个更全面的方法来做到这一点。

注意:在 Windows 10 中,所有版本都报告为 10.0,无论 Microsoft 版本之间有多少变化。有关详细信息,您必须查看注册表(另请参阅 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ReleaseId)。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class WinVer {
    enum WindowsType {
        /*
         * Keep descending for best match, or rewrite using comparitor
         */
        WINDOWS_10(10.0f),
        WINDOWS_8_1(6.3f),
        WINDOWS_8(6.2f),
        WINDOWS_7(6.1f),
        WINDOWS_VISTA(6.0f),
        WINDOWS_XP_64(5.2f),
        WINDOWS_XP(5.1f),
        WINDOWS_ME(4.9f),
        WINDOWS_2000(5.0f),
        WINDOWS_NT(4.0f), // or Win95
        UNKNOWN(0.0f);

        private float version;

        WindowsType(float version) {
            this.version = version;
        }

        public static float parseFloat(String versionString) {
            float version = 0.0f;
            /*
             * Sanitize the String.
             *
             * Windows version is generally formatted x.x (e.g. 3.1, 6.1, 10.0)
             * This format can later be treated as a float for comparison.
             * Since we have no guarantee the String will be formatted properly, we'll sanitize it.
             * For more complex comparisons, try a SemVer library, such as zafarkhaja/jsemver. <3
             */
            List<String> parts = Arrays.asList(versionString.replaceAll("[^\\d.]", "").split("\\."));

            // Fix .add(...), .remove(...), see https://stackoverflow.com/a/5755510/3196753
            parts = new ArrayList<>(parts);

            // Fix length
            while (parts.size() != 2) {
                if (parts.size() > 2) {
                    // pop off last element
                    parts.remove(parts.size() - 1);
                }
                if (parts.size() < 2) {
                    // push zero
                    parts.add("0");
                }
            }

            String sanitized = String.join(".", parts.toArray(new String[0]));
            try {
                version = Float.parseFloat(sanitized);
            } catch (NumberFormatException e) {
                System.err.println("ERROR: Something went wrong parsing " + sanitized + " as a float");
            }

            return version;
        }

        public static WindowsType match(float version) {
            WindowsType detectedType = UNKNOWN;

            // Warning: Iterates in order they were declared.  If you don't like this, write a proper comparator instead. <3
            for (WindowsType type : WindowsType.values()) {
                if (type.version >= version) {
                    detectedType = type;
                } else {
                    break;
                }
            }
            return detectedType;
        }

    }

    public static void main(String... args) {

        String osName = System.getProperty("os.name");
        String osVer = System.getProperty("os.version");

        if (osName.toLowerCase().startsWith("windows")) {
            System.out.println("Yes, you appear to be running windows");
            float windowsVersion = WindowsType.parseFloat(osVer);
            System.out.println(" - Windows version reported is: " + windowsVersion);
            WindowsType windowsType = WindowsType.match(windowsVersion);
            System.out.println(" - Windows type is detected as: " + windowsType);

            if(windowsVersion >= WindowsType.WINDOWS_XP.version) {
                System.out.println("Yes, this OS is Windows XP or higher.");
            } else {
                System.out.println("No, this OS is NOT Windows XP or higher.");
            }
        }
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2011-05-11
    • 2011-12-11
    相关资源
    最近更新 更多