596

Java プログラムがプログラムで実行されているホストのオペレーティング システムを特定したいと考えています (たとえば、Windows と Unix のどちらのプラットフォームを使用しているかに基づいて、さまざまなプロパティを読み込めるようにしたいと考えています)。これを 100% の信頼性で行う最も安全な方法は何ですか?

4

21 に答える 21

705

以下を使用できます。

System.getProperty("os.name")

PSこのコードは役に立つかもしれません:

class ShowProperties {
    public static void main(String[] args) {
        System.getProperties().list(System.out);
    }
}

Java 実装によって提供されるすべてのプロパティを出力するだけです。プロパティを介して Java 環境について何がわかるかがわかります。:-)

于 2008-10-23T03:48:47.127 に答える
183

他の回答で示されているように、 System.getProperty は生データを提供します。ただし、Apache Commons Lang コンポーネントは、前述の Swingx OS ユーティリティと同様に、java.lang.System のような便利なプロパティを持つラッパーを提供します。SystemUtils.IS_OS_WINDOWS

于 2010-05-27T00:17:12.847 に答える
98

2008 年 10 月:

静的変数にキャッシュすることをお勧めします。

public static final class OsUtils
{
   private static String OS = null;
   public static String getOsName()
   {
      if(OS == null) { OS = System.getProperty("os.name"); }
      return OS;
   }
   public static boolean isWindows()
   {
      return getOsName().startsWith("Windows");
   }

   public static boolean isUnix() // and so on
}

そうすれば、O を要求するたびに、アプリケーションの有効期間中にプロパティを複数回取得することはありません。


2016 年 2 月: 7 年以上後:

Windows 10 にはバグがあります (元の回答の時点では存在しませんでした)。「Windows 10 の Java の「os.name」は?」を
参照してください。

于 2008-10-23T03:58:33.830 に答える
33

TL;DR

OS へのアクセス: System.getProperty("os.name").


ちょっと待って!!!

ユーティリティ クラスを作成して、再利用できるようにしましょう。そして、おそらく複数の呼び出しではるかに高速です。きれいに、きれいに、より速く!

このようなユーティリティ関数の Util クラスを作成します。次に、オペレーティング システムの種類ごとにパブリック列挙型を作成します。

public class Util {     
        public enum OS {
            WINDOWS, LINUX, MAC, SOLARIS
        };// Operating systems.

    private static OS os = null;

    public static OS getOS() {
        if (os == null) {
            String operSys = System.getProperty("os.name").toLowerCase();
            if (operSys.contains("win")) {
                os = OS.WINDOWS;
            } else if (operSys.contains("nix") || operSys.contains("nux")
                    || operSys.contains("aix")) {
                os = OS.LINUX;
            } else if (operSys.contains("mac")) {
                os = OS.MAC;
            } else if (operSys.contains("sunos")) {
                os = OS.SOLARIS;
            }
        }
        return os;
    }
}

これで、次のように任意のクラスから簡単にクラスを呼び出すことができます.

            switch (Util.getOS()) {
            case WINDOWS:
                //do windows stuff
                break;
            case LINUX:

そしてそれだけです!

于 2015-07-21T19:02:48.163 に答える
18

あなたが達成しようとしていることの小さな例は、おそらくclass下にあるものに似ているでしょう:

import java.util.Locale;

public class OperatingSystem
{
    private static String OS = System.getProperty("os.name", "unknown").toLowerCase(Locale.ROOT);

    public static boolean isWindows()
    {
        return OS.contains("win");
    }

    public static boolean isMac()
    {
        return OS.contains("mac");
    }

    public static boolean isUnix()
    {
        return OS.contains("nux");
    }
}

この特定の実装は非常に信頼性が高く、普遍的に適用できるはずです。それをコピーしてclass、選択した場所に貼り付けるだけです。

于 2013-07-06T19:06:32.490 に答える
11

これを試してみてください、シンプルで簡単です

System.getProperty("os.name");
System.getProperty("os.version");
System.getProperty("os.arch");
于 2014-05-07T08:20:57.057 に答える
10

オープン ソース プロジェクトがこのようなことを行う方法に興味がある場合は、このジャンクを処理する Terracotta クラス (Os.java) をここで確認できます。

また、JVM バージョン (Vm.java および VmVersion.java) を処理する同様のクラスを以下に示します。

于 2008-10-23T04:37:26.543 に答える
8

以下のコードは、システム API から取得できる値を示しています。これらはすべて、この API を通じて取得できるものです。

public class App {
    public static void main( String[] args ) {
        //Operating system name
        System.out.println(System.getProperty("os.name"));

        //Operating system version
        System.out.println(System.getProperty("os.version"));

        //Path separator character used in java.class.path
        System.out.println(System.getProperty("path.separator"));

        //User working directory
        System.out.println(System.getProperty("user.dir"));

        //User home directory
        System.out.println(System.getProperty("user.home"));

        //User account name
        System.out.println(System.getProperty("user.name"));

        //Operating system architecture
        System.out.println(System.getProperty("os.arch"));

        //Sequence used by operating system to separate lines in text files
        System.out.println(System.getProperty("line.separator"));

        System.out.println(System.getProperty("java.version")); //JRE version number

        System.out.println(System.getProperty("java.vendor.url")); //JRE vendor URL

        System.out.println(System.getProperty("java.vendor")); //JRE vendor name

        System.out.println(System.getProperty("java.home")); //Installation directory for Java Runtime Environment (JRE)

        System.out.println(System.getProperty("java.class.path"));

        System.out.println(System.getProperty("file.separator"));
    }
}

答え:-

Windows 7
6.1
;
C:\Users\user\Documents\workspace-eclipse\JavaExample
C:\Users\user
user
amd64


1.7.0_71
http://java.oracle.com/
Oracle Corporation
C:\Program Files\Java\jre7
C:\Users\user\Documents\workspace-Eclipse\JavaExample\target\classes
\
于 2015-05-03T09:51:12.540 に答える
6

SwingxのOS Utils がその役目を果たしていることがわかりました。

于 2008-10-23T04:40:21.717 に答える
3

そのようなものはconstであるべきだと信じているという理由だけで、私はWolfgangの答えが好きでした...

だから私は自分自身のためにそれを少し言い換えて、それを共有することを考えました:)

/**
 * types of Operating Systems
 *
 * please keep the note below as a pseudo-license
 *
 * helper class to check the operating system this Java VM runs in
 * http://stackoverflow.com/questions/228477/how-do-i-programmatically-determine-operating-system-in-java
 * compare to http://svn.terracotta.org/svn/tc/dso/tags/2.6.4/code/base/common/src/com/tc/util/runtime/Os.java
 * http://www.docjar.com/html/api/org/apache/commons/lang/SystemUtils.java.html
 */
public enum OSType {
    MacOS("mac", "darwin"),
    Windows("win"),
    Linux("nux"),
    Other("generic");

    private static OSType detectedOS;

    private final String[] keys;

    private OSType(String... keys) {
        this.keys = keys;
    }

    private boolean match(String osKey) {
        for (int i = 0; i < keys.length; i++) {
            if (osKey.indexOf(keys[i]) != -1)
                return true;
        }
        return false;
    }

    public static OSType getOS_Type() {
        if (detectedOS == null)
            detectedOS = getOperatingSystemType(System.getProperty("os.name", Other.keys[0]).toLowerCase());
        return detectedOS;
    }

    private static OSType getOperatingSystemType(String osKey) {
        for (OSType osType : values()) {
            if (osType.match(osKey))
                return osType;
        }
        return Other;
    }
}
于 2014-03-17T11:38:50.573 に答える
3

sun.awt.OSInfo#getOSType() メソッドを使用するだけです

于 2016-01-22T15:46:18.253 に答える
2

システムの OS タイプ、名前、Java 情報などに関するすべての情報を表示するためのこのコード。

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Properties pro = System.getProperties();
    for(Object obj : pro.keySet()){
        System.out.println(" System  "+(String)obj+"     :  "+System.getProperty((String)obj));
    }
}
于 2014-08-01T10:47:27.327 に答える