Java プログラムがプログラムで実行されているホストのオペレーティング システムを特定したいと考えています (たとえば、Windows と Unix のどちらのプラットフォームを使用しているかに基づいて、さまざまなプロパティを読み込めるようにしたいと考えています)。これを 100% の信頼性で行う最も安全な方法は何ですか?
21 に答える
以下を使用できます。
System.getProperty("os.name")
PSこのコードは役に立つかもしれません:
class ShowProperties {
public static void main(String[] args) {
System.getProperties().list(System.out);
}
}
Java 実装によって提供されるすべてのプロパティを出力するだけです。プロパティを介して Java 環境について何がわかるかがわかります。:-)
他の回答で示されているように、 System.getProperty は生データを提供します。ただし、Apache Commons Lang コンポーネントは、前述の Swingx OS ユーティリティと同様に、java.lang.System のような便利なプロパティを持つラッパーを提供します。SystemUtils.IS_OS_WINDOWS
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」は?」を
参照してください。
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:
そしてそれだけです!
あなたが達成しようとしていることの小さな例は、おそらく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
、選択した場所に貼り付けるだけです。
これを試してみてください、シンプルで簡単です
System.getProperty("os.name");
System.getProperty("os.version");
System.getProperty("os.arch");
オープン ソース プロジェクトがこのようなことを行う方法に興味がある場合は、このジャンクを処理する Terracotta クラス (Os.java) をここで確認できます。
http://svn.terracotta.org/svn/tc/dso/trunk/code/base/common/src/com/tc/util/runtime/- http://svn.terracotta.org/svn/tc/dso/tags/2.6.4/code/base/common/src/com/tc/util/runtime/
また、JVM バージョン (Vm.java および VmVersion.java) を処理する同様のクラスを以下に示します。
以下のコードは、システム 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
\
SwingxのOS Utils がその役目を果たしていることがわかりました。
そのようなものは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;
}
}
sun.awt.OSInfo#getOSType() メソッドを使用するだけです
システムの 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));
}
}