Ich möchte das Betriebssystem des Hosts ermitteln, auf dem mein Java-Programm programmgesteuert ausgeführt wird (zum Beispiel: Ich möchte verschiedene Eigenschaften laden können, je nachdem, ob ich mich auf einer Windows- oder einer Unix-Plattform befinde). Was ist der sicherste Weg, dies mit 100% iger Zuverlässigkeit zu tun?
java
operating-system
karlgrz
quelle
quelle
Windows 10
undos.name
gebe mir dochWindows 8.1
. Warum ist das so? Woher kommt das?Wie in anderen Antworten angegeben, stellt System.getProperty die Rohdaten bereit. Die Apache Commons Lang-Komponente bietet jedoch einen Wrapper für java.lang.System mit praktischen Eigenschaften
SystemUtils.IS_OS_WINDOWS
wie dem oben genannten Swingx OS util.quelle
Okt. 2008:
Ich würde empfehlen, es in einer statischen Variablen zwischenzuspeichern:
Auf diese Weise rufen Sie die Eigenschaft jedes Mal, wenn Sie nach den Os fragen, nicht mehr als einmal in der Lebensdauer Ihrer Anwendung ab.
Februar 2016: 7+ Jahre später:
Es gibt einen Fehler mit Windows 10 (der zum Zeitpunkt der ursprünglichen Antwort nicht vorhanden war).
Siehe " Javas" os.name "für Windows 10? "
quelle
isWindows
,isUnix
usw. Auf diese Weise können speichern auf der Saite Vergleichszeit auch.Einige der Links in den obigen Antworten scheinen defekt zu sein. Ich habe im folgenden Code Zeiger auf den aktuellen Quellcode hinzugefügt und biete einen Ansatz für die Behandlung der Prüfung mit einer Aufzählung als Antwort an, damit bei der Auswertung des Ergebnisses eine switch-Anweisung verwendet werden kann:
Die Helferklasse ist:
quelle
Die folgenden JavaFX-Klassen verfügen über statische Methoden zum Ermitteln des aktuellen Betriebssystems (isWindows (), isLinux () ...):
Beispiel:
quelle
TL; DR
Für den Zugriff auf das Betriebssystem verwenden Sie :
System.getProperty("os.name")
.Aber warum nicht eine Utility-Klasse erstellen, sie wiederverwendbar machen? Und wahrscheinlich viel schneller bei mehreren Anrufen. Sauber, klar, schneller!
Erstellen Sie eine Util-Klasse für solche Utility-Funktionen. Erstellen Sie dann öffentliche Aufzählungen für jeden Betriebssystemtyp.
Jetzt können Sie die Klasse von jeder Klasse aus wie folgt aufrufen: (PS Da wir die Variable os als statisch deklariert haben, benötigt sie nur einmal Zeit, um den Systemtyp zu identifizieren, und kann dann verwendet werden, bis Ihre Anwendung angehalten wird.)
und das ist alles!
quelle
Ein kleines Beispiel für das, was Sie erreichen möchten,
class
ähnelt wahrscheinlich dem, was darunter liegt:Diese spezielle Implementierung ist sehr zuverlässig und sollte universell anwendbar sein. Kopieren Sie es einfach und fügen Sie es in das Ihrer
class
Wahl ein.quelle
Wenn Sie daran interessiert sind, wie ein Open Source-Projekt solche Dinge macht, können Sie sich hier die Terracotta-Klasse (Os.java) ansehen, die diesen Müll behandelt:
http://svn.terracotta.org/svn/tc/dso/trunk/code/base/common/src/com/tc/util/runtime/Eine ähnliche Klasse für JVM-Versionen (Vm.java und VmVersion.java) finden Sie hier:
quelle
toLowerCase
ohne Angabe eines GebietsschemasVersuchen Sie dies einfach und unkompliziert
quelle
Entnommen aus diesem Projekt https://github.com/RishiGupta12/serial-communication-manager
quelle
Der folgende Code zeigt die Werte, die Sie von der System-API erhalten können. Dies sind alles Dinge, die Sie über diese API erhalten können.
Antworten: -
quelle
Ich finde, dass die OS Utils von Swingx den Job machen.
quelle
Ich denke, dass das Folgen eine breitere Abdeckung in weniger Zeilen ergeben kann
Weitere Details finden Sie hier: https://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html
quelle
quelle
Sie können einfach die Methode sun.awt.OSInfo # getOSType () verwenden
quelle
Wenn Sie in einer sicherheitsrelevanten Umgebung arbeiten, lesen Sie dies bitte durch.
Bitte vertrauen Sie niemals einer Eigenschaft, die Sie über das
System#getProperty(String)
Unterprogramm erhalten haben! Eigentlich fast jedes Eigentum , einschließlichos.arch
,os.name
undos.version
ist nicht nur lesbar , wie Sie vielleicht erwarten würde - stattdessen sind sie eigentlich ganz im Gegenteil.Zunächst kann jeder Code mit ausreichender Berechtigung zum Aufrufen der
System#setProperty(String, String)
Unterroutine das zurückgegebene Literal nach Belieben ändern. Dies ist hier jedoch nicht unbedingt das Hauptproblem, da es durch die Verwendung eines so genannten Problems gelöst werden kannSecurityManager
, wie hier ausführlicher beschrieben .Das eigentliche Problem ist, dass jeder Benutzer diese Eigenschaften bearbeiten kann, wenn er die
JAR
betreffende Funktion ausführt. Dies bedeutet, dass es keine Möglichkeit gibt , festzustellen, ob diese Eigenschaften tatsächlich korrekt sind. Aus diesem Grund finden Sie hier einige zusätzliche Überprüfungen, um Manipulationen zu vermeiden:Eine weitere gute Idee ist es, das Vorhandensein betriebssystemspezifischer Verzeichnisse zu überprüfen. Denken Sie bei jedem Ansatz daran, dass die Java- Sprache als plattformübergreifende Einheit eingerückt ist. Warum versuchst du nicht das Gleiche zu tun?
quelle
Ich mochte Wolfgangs Antwort, nur weil ich glaube, dass solche Dinge Konstanten sein sollten ...
Also habe ich es ein bisschen für mich selbst umformuliert und dachte, es zu teilen :)
quelle
Dieser Code zum Anzeigen aller Informationen über den Betriebssystem-Betriebssystemtyp, den Namen, Java-Informationen usw.
quelle
In der Klasse com.sun.jna.Platform finden Sie nützliche statische Methoden wie
und vieles mehr.
Wenn Sie Maven verwenden, fügen Sie einfach die Abhängigkeit hinzu
Andernfalls suchen Sie einfach die JNA-Bibliotheks-JAR-Datei (z. B. jna-5.2.0.jar) und fügen Sie sie dem Klassenpfad hinzu.
quelle
Verwenden Sie einfach
com.sun.javafx.util.Utils
wie unten.ODER VERWENDUNG
quelle