Java で Windows OS 判定いろいろ

Windows 判定

Grizzly のソース見てたら、Windows 判定をこんな風にやってた。

private static final boolean WIN32 = "\\".equals(System.getProperty("file.separator"));

なるほど。

何も考えずにやるとこんな感じだけど

private static final boolean WIN32 = System.getProperty("os.name")
        .toLowerCase().startsWith("windows");

OS 名の文字列よりはファイルセパレータの方が変化が少ないという判断ですかね。

まぁ、やるならこちらの方がよいですかね。

private static final boolean WIN32 = File.separatorChar == '\\';

他には

無理やり考えると、改行コードで見たり、

private static final boolean WIN = "\r\n".equals(System.getProperty("line.separator"));

        

パス(PATHやCLASSPATH)区切は*nix系は ':' なので、

private static final boolean WIN32 = File.pathSeparatorChar == ';';

        

MXBeanからOS名取ったり、

private static final boolean WIN = ManagementFactory.getOperatingSystemMXBean()
        .getName().toLowerCase().startsWith("windows");

        

Windows はロードアベレージをサポートしていないってことで

private static final boolean WIN = ManagementFactory.getOperatingSystemMXBean()
        .getSystemLoadAverage() < 0;

        

Win32FileSystem もあるので、ダメかな

private static final boolean WIN = FileSystems.getDefault().getClass().getSimpleName()
        .equals("WinNTFileSystem");

なんてのも無理くり書くことはできる。

一般的には

以下のようにすることが多いでしょう。

    public static final boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().startsWith("win");
    public static final boolean IS_MAC = System.getProperty("os.name").toLowerCase().startsWith("mac");
    public static final boolean IS_LINUX = System.getProperty("os.name").toLowerCase().startsWith("linux");