回答:
以下を使用できます。
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 utilによく似た、などの便利なプロパティを備えた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
}
そうすれば、Osを要求するたびに、アプリケーションの存続期間中にプロパティを2回以上フェッチすることはありません。
2016年2月:7年以上後:
Windows 10にはバグがあります(元の回答の時点では存在していませんでした)。
「Windows 10のJavaの「os.name」を参照してください。」
isWindows
、isUnix
あなたはまた、文字列の比較時間を節約する方法ことなどを、。
上記の回答の一部のリンクが壊れているようです。以下のコードに現在のソースコードへのポインターを追加し、結果としてenumを使用してチェックを処理する方法を提供し、結果を評価するときにswitchステートメントを使用できるようにします。
OsCheck.OSType ostype=OsCheck.getOperatingSystemType();
switch (ostype) {
case Windows: break;
case MacOS: break;
case Linux: break;
case Other: break;
}
ヘルパークラスは次のとおりです。
/**
* helper class to check the operating system this Java VM runs in
*
* please keep the notes below as a pseudo-license
*
* 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
*/
import java.util.Locale;
public static final class OsCheck {
/**
* types of Operating Systems
*/
public enum OSType {
Windows, MacOS, Linux, Other
};
// cached result of OS detection
protected static OSType detectedOS;
/**
* detect the operating system from the os.name System property and cache
* the result
*
* @returns - the operating system detected
*/
public static OSType getOperatingSystemType() {
if (detectedOS == null) {
String OS = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH);
if ((OS.indexOf("mac") >= 0) || (OS.indexOf("darwin") >= 0)) {
detectedOS = OSType.MacOS;
} else if (OS.indexOf("win") >= 0) {
detectedOS = OSType.Windows;
} else if (OS.indexOf("nux") >= 0) {
detectedOS = OSType.Linux;
} else {
detectedOS = OSType.Other;
}
}
return detectedOS;
}
}
次のJavaFXクラスには、現在のOS(isWindows()、isLinux()...)を判別するための静的メソッドがあります。
例:
if (PlatformUtil.isWindows()){
...
}
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;
}
}
これで、次のように任意のクラスからクラスを簡単に呼び出すことができます(PSは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
好みの場所に貼り付けてください。
オープンソースプロジェクトがこのような処理を行う方法に興味がある場合は、このジャンクを処理するTerracottaクラス(Os.java)をここで確認できます。
また、JVMバージョン(Vm.javaおよびVmVersion.java)を処理するための同様のクラスをここで確認できます。
toLowerCase
ロケールを指定せずに使用
このプロジェクトから取得https://github.com/RishiGupta12/serial-communication-manager
String osName = System.getProperty("os.name");
String osNameMatch = osName.toLowerCase();
if(osNameMatch.contains("linux")) {
osType = OS_LINUX;
}else if(osNameMatch.contains("windows")) {
osType = OS_WINDOWS;
}else if(osNameMatch.contains("solaris") || osNameMatch.contains("sunos")) {
osType = OS_SOLARIS;
}else if(osNameMatch.contains("mac os") || osNameMatch.contains("macos") || osNameMatch.contains("darwin")) {
osType = OS_MAC_OS_X;
}else {
}
以下のコードは、システム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がうまく機能していることがわかりました。
フォローすると、より少ないラインでより広い範囲をカバーできると思います
import org.apache.commons.exec.OS;
if (OS.isFamilyWindows()){
//load some property
}
else if (OS.isFamilyUnix()){
//load some other property
}
詳細はこちら:https : //commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html
String osName = System.getProperty("os.name");
System.out.println("Operating system " + osName);
sun.awt.OSInfo#getOSType()メソッドだけを使用できます
セキュリティ上重要な環境で作業している場合は、これを最後までお読みください。
System#getProperty(String)
サブルーチンで取得した物件は絶対に信用しないでください!実際、、、を含むほとんどすべてのプロパティはos.arch
、期待どおりに読み取り専用os.name
でos.version
はありません。代わりに、実際にはまったく逆です。
まず第一に、System#setProperty(String, String)
サブルーチンを呼び出すのに十分な権限を持つコードは、返されたリテラルを自由に変更できます。それは、いわゆるを使用して解決できるようしかし、それは、ここでは必ずしも主な問題ではありませんSecurityManager
をより詳細に説明するように、ここに。
実際の問題はJAR
、問題のを実行するときに、すべてのユーザーがこれらのプロパティを編集できることです。つまり、これらのプロパティが実際に実際に正確であるかどうかを判断する方法はありません。このため、改ざんを回避するためのいくつかの追加チェックを次に示します。
// The first thing we're able to do is to query the filesystem.
switch (java.io.File.separator)
{
case "/":
// Windows is a potential candidate.
break;
case "\\":
// And here it could really be anything else.
break;
default:
// There's probably something really wrong here by now.
break;
}
別の良いアイデアは、オペレーティングシステム固有のディレクトリの存在を確認することです。どのようなアプローチを取る場合でも、Java言語はクロスプラットフォームであることを示しています。だから、同じことをしてみませんか?
ヴォルフガングの答えが気に入ったのは、そのようなことがconstsである必要があると思っているからです...
だから私は自分のために少し言い換えて、それを共有しようと思いました:)
/**
* 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;
}
}
com.sun.jna.Platformクラスには、次のような便利な静的メソッドがあります。
Platform.isWindows();
Platform.is64Bit();
Platform.isIntel();
Platform.isARM();
そして、はるかに。
Mavenを使用する場合は、依存関係を追加するだけです
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.2.0</version>
</dependency>
それ以外の場合は、jnaライブラリjarファイル(例:jna-5.2.0.jar)を見つけてクラスパスに追加します。
Windows 10
していos.name
ますが、それでもくれWindows 8.1
ます。何故ですか?これはどこから来たのですか?