it-swarm.com.de

Wie kann ich ein Unix-ähnliches Betriebssystem in Java erkennen?

Ok, ich weiß, dass System.getProperty("os.name") mir den Namen des Betriebssystems gibt, unter dem ich laufe, aber das ist keine große Hilfe. Ich muss wissen, ob das Betriebssystem, auf dem ich laufe, ein "Unix-ähnliches" Betriebssystem ist. Es ist mir egal, ob es sich um HP-UX, AIX, Mac OS X oder was auch immer handelt.

Aus der Liste möglicher Werte für os.name scheint es ein schneller und schmutziger Weg zu sein, ein 'Unix-artiges' Betriebssystem zu erkennen, das prüft, ob os.name nicht "Windows" enthält. Die falschen positiven Ergebnisse, die mich erwarten lassen, sind Betriebssysteme, auf die mein Code sehr unwahrscheinlich trifft! Trotzdem würde ich gerne einen besseren Weg finden, wenn es einen gibt.

31
mluisbrown

Ich habe Ihr Schema im Produktionscode unter Windows XP, Vista, Win7, Mac OS 10.3 - 10.6 und einer Vielzahl von Linux-Distributionen ohne Probleme verwendet:

    if (System.getProperty("os.name").startsWith("Windows")) {
        // includes: Windows 2000,  Windows 95, Windows 98, Windows NT, Windows Vista, Windows XP
    } else {
        // everything else
    } 

Erkennen Sie Unix-ähnlich durch nicht Erkennen von Windows.

19

Verwenden Sie die Utility-Klasse org.Apache.commons.lang.SystemUtils von Commons Lang. Sie hat eine Nice IS_OS_UNIX -Konstante. Aus dem Javadoc:

Ist true, wenn dies ein POSIX-Compilant-System ist, wie in AIX, HP-UX, Irix, Linux, MacOSX, Solaris oder Sun OS.

Das Feld gibt false zurück, wenn OS_NAME den Wert null hat.

Und der Test wird:

if (SystemUtils.IS_OS_UNIX) {
    ...
}

Einfach, effektiv, leicht zu lesen, keine kryptischen Tricks.

33
Pascal Thivent

File.listRoots() gibt Ihnen ein Array der Root-Verzeichnisse des Dateisystems.

Wenn Sie sich auf einem Unix-ähnlichen System befinden, sollte das Array einen einzelnen Eintrag "/" enthalten, und auf Windows-Systemen erhalten Sie etwas wie ["C:", "D:", ...].

Bearbeiten: @ chris_l: Ich habe Mobiltelefone total vergessen. Bei einigen Suchvorgängen wird angezeigt, dass Android einen "/\0\0" zurückgibt - einen Schrägstrich, gefolgt von zwei Null-Bytes (vermutlich ein Fehler). Es sieht so aus, als würden wir durch Glück und Zufall vorerst Fehlalarme vermeiden. Leider konnten auf anderen Telefonen keine guten Daten gefunden werden.

Es ist wahrscheinlich keine gute Idee, den gleichen Code auf Desktops und Mobiltelefonen zu verwenden, aber es ist interessant zu wissen. Es sieht so aus, als müsste man nach bestimmten Funktionen und nicht nur nach dem Systemtyp suchen.

17
MikeD

Javadoc sagt: Auf UNIX-Systemen ist der Wert dieses Feldes '/'; Auf Microsoft Windows-Systemen ist dies '\'.

System.out.println( File.separatorChar == '/' ? "Unix" : "Windows" );
9
stacker

Bei System.getProperty("os.name"); geht es um das Beste, was Sie bekommen werden.

6
user177800

Verwenden Sie File.pathSeparator oder File.separator. Der erste wird ";" in Windows und ":" in Unix. Die zweite gibt "\" in Windows und "/" in Unix zurück.

1
Greg Mallett

Ich stimme @Fuzzy darin zu, dass ich glaube, dass die einzige Möglichkeit, mit der Java diese Informationen abrufen wollte, die os.name-Eigenschaft war.

Die einzigen anderen Dinge, die mir einfallen, sind:

  1. Verwenden Sie ein Shell-Skript oder einen Batch-Datei-Wrapper, um Ihre Java-App zu starten, die die Betriebssysteminformationen mit dem Argument -D an die JVM übergibt. Obwohl Ihre Beschreibung gegeben ist, klingt dies nicht machbar.

  2. Sie könnten versuchen zu prüfen, ob ein betriebssystemspezifisches Verzeichnis existiert. Sie könnten beispielsweise davon ausgehen, dass das Verzeichnis "/" immer auf einem Unix-artigen System vorhanden ist, jedoch nicht unter Windows.

    if ((neue Datei ("/")). exists ()) {System.out.println ("Ich bin auf einem Unix-System!"); }

  3. Versuchen Sie, einen Unix-spezifischen Befehlszeilenbefehl wie ls zu starten, und prüfen Sie den Rückkehrcode. Wenn es funktioniert hat, sind Sie auf einem Unix-ähnlichen System, wenn Sie nicht unter Windows sind.

Alle diese Lösungen sind wirklich nur Hacks und ehrlich gesagt fühle ich mich bei keinem von ihnen wirklich großartig. Mit Ihrem ursprünglichen Gedanken sind Sie wahrscheinlich am besten. Spaß, wie?

1

Es ist eine ziemlich alte Frage, die man stoßen kann, aber trotzdem kann man diese verwenden: System.getProperty("os.name").toLowerCase();

0
neo7