Je voudrais déterminer le système d'exploitation de l'hôte que mon programme Java exécute par programme (par exemple: je voudrais pouvoir charger différentes propriétés selon que je suis sur une plate-forme Windows ou Unix). Quelle est la façon la plus sûre de le faire avec une fiabilité à 100%?
java
operating-system
karlgrz
la source
la source
Windows 10
et pourtantos.name
me donneWindows 8.1
. Pourquoi donc? D'où cela vient-il?Comme indiqué dans d'autres réponses, System.getProperty fournit les données brutes. Cependant, le composant Apache Commons Lang fournit un wrapper pour java.lang.System avec des propriétés pratiques comme
SystemUtils.IS_OS_WINDOWS
, tout comme l'utilitaire Swingx OS susmentionné.la source
Octobre 2008:
Je recommanderais de le mettre en cache dans une variable statique:
De cette façon, chaque fois que vous demandez l'Os, vous ne récupérez pas la propriété plus d'une fois dans la durée de vie de votre application.
Février 2016: 7+ ans plus tard:
Il y a un bug avec Windows 10 (qui n'existait pas au moment de la réponse d'origine).
Voir " Java" os.name "pour Windows 10? "
la source
isWindows
,isUnix
etc. De cette façon , vous économisez sur le temps de comparaison de chaînes également.certains des liens dans les réponses ci-dessus semblent rompus. J'ai ajouté des pointeurs vers le code source actuel dans le code ci-dessous et propose une approche pour gérer la vérification avec une énumération comme réponse afin qu'une instruction switch puisse être utilisée lors de l'évaluation du résultat:
La classe d'assistance est:
la source
Les classes JavaFX suivantes ont des méthodes statiques pour déterminer le système d'exploitation actuel (isWindows (), isLinux () ...):
Exemple:
la source
TL; DR
Pour accéder à l' utilisation du système d'exploitation:
System.getProperty("os.name")
.Mais pourquoi ne pas créer une classe utilitaire, la rendre réutilisable! Et probablement beaucoup plus rapide sur plusieurs appels. Propre, clair, plus rapide!
Créez une classe Util pour ces fonctions utilitaires. Créez ensuite des énumérations publiques pour chaque type de système d'exploitation.
Maintenant, vous pouvez facilement appeler une classe à partir de n'importe quelle classe comme suit, (PS Puisque nous avons déclaré la variable os comme statique, elle ne prendra du temps qu'une seule fois pour identifier le type de système, puis elle peut être utilisée jusqu'à ce que votre application s'arrête.)
et c'est tout!
la source
Un petit exemple de ce que vous essayez de réaliser serait probablement
class
similaire à ce qui se trouve en dessous:Cette mise en œuvre particulière est assez fiable et devrait être universellement applicable. Copiez-le et collez-le dans votre
class
choix.la source
Si vous êtes intéressé par la façon dont un projet open source fait des choses comme ça, vous pouvez consulter la classe Terracotta (Os.java) qui gère ces indésirables ici:
http://svn.terracotta.org/svn/tc/dso/trunk/code/base/common/src/com/tc/util/runtime/Et vous pouvez voir une classe similaire pour gérer les versions JVM (Vm.java et VmVersion.java) ici:
la source
toLowerCase
sans spécifier de lieuEssayez ceci, simple et facile
la source
Tiré de ce projet https://github.com/RishiGupta12/serial-communication-manager
la source
Le code ci-dessous montre les valeurs que vous pouvez obtenir de l'API système, toutes ces choses que vous pouvez obtenir via cette API.
Réponses:-
la source
Je trouve que l' OS Utils de Swingx fait le travail.
la source
Je pense que suivre peut donner une couverture plus large en moins de lignes
Plus de détails ici: https://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html
la source
la source
Vous pouvez simplement utiliser la méthode sun.awt.OSInfo # getOSType ()
la source
Si vous travaillez dans un environnement sensible à la sécurité, veuillez le lire attentivement.
Veuillez ne jamais faire confiance à une propriété obtenue via le
System#getProperty(String)
sous - programme! En fait, presque toutes les propriétés, y comprisos.arch
,os.name
etos.version
ne sont pas en lecture seule comme on pourrait s'y attendre - au lieu de cela, elles sont en fait tout à fait le contraire.Tout d'abord, tout code disposant d'une autorisation suffisante pour invoquer le
System#setProperty(String, String)
sous - programme peut modifier le littéral renvoyé à volonté. Cependant, ce n'est pas nécessairement le problème principal ici, car il peut être résolu en utilisant un soi-disantSecurityManager
, comme décrit plus en détail ici .Le problème réel est que tout utilisateur peut modifier ces propriétés lors de l'exécution de la
JAR
question. Cela signifie qu'il n'y a aucun moyen de déterminer si ces propriétés sont effectivement exactes. Pour cette raison, voici quelques vérifications supplémentaires pour essayer d'éviter toute falsification:Une autre bonne idée est de vérifier la présence de répertoires spécifiques au système d'exploitation. Quelle que soit l'approche que vous puissiez adopter, n'oubliez pas que le langage Java est en retrait pour être la plateforme multiplateforme. Alors, pourquoi n'essayez-vous pas de faire de même?
la source
J'ai aimé la réponse de Wolfgang, juste parce que je crois que des choses comme ça devraient être constantes ...
donc je l'ai reformulé un peu pour moi, et j'ai pensé le partager :)
la source
Ce code pour afficher toutes les informations sur le type de système d'exploitation, le nom, les informations java, etc.
la source
Dans la classe com.sun.jna.Platform, vous pouvez trouver des méthodes statiques utiles comme
et beaucoup plus.
Si vous utilisez Maven, ajoutez simplement la dépendance
Sinon, il suffit de trouver le fichier jar de la bibliothèque jna (ex. Jna-5.2.0.jar) et de l'ajouter à classpath.
la source
Utilisez simplement
com.sun.javafx.util.Utils
comme ci-dessous.OU UTILISER
la source