Question Comment est-ce que je détermine par programme le système d'exploitation dans Java?


Je voudrais déterminer le système d'exploitation de l'hôte sur lequel mon programme Java s'exécute par programmation (par exemple: je voudrais pouvoir charger différentes propriétés selon que je suis sur une plate-forme Windows ou Unix). Quel est le moyen le plus sûr de le faire avec une fiabilité à 100%?


426
2017-10-23 03:47


origine


Réponses:


Vous pouvez utiliser:

System.getProperty("os.name")

P.S. Vous pouvez trouver ce code utile:

class ShowProperties {
    public static void main(String[] args) {
        System.getProperties().list(System.out);
    }
}

Tout ce qu'il fait est d'imprimer toutes les propriétés fournies par vos implémentations Java. Cela vous donnera une idée de ce que vous pouvez trouver sur votre environnement Java via les propriétés. :-)


517
2017-10-23 03:48



Comme indiqué dans les autres réponses, System.getProperty fournit les données brutes. Cependant, le Apache Commons Lang composant fournit un wrapper pour java.lang.System avec des propriétés pratiques comme SystemUtils.IS_OS_WINDOWS, un peu comme le susdit système d'exploitation Swingx OS.


124
2018-05-27 00:17



Oct. 2008:

Je recommande de le mettre en cache dans une variable statique:

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
}

De cette façon, chaque fois que vous demandez les Os, vous ne récupérez pas la propriété plus d'une fois au cours de 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 originale).
Voir "Java "os.name" pour Windows 10?"


65
2017-10-23 03:58



certains des liens dans les réponses ci-dessus semblent être brisés. J'ai ajouté des pointeurs au code source actuel dans le code ci-dessous et propose une approche pour gérer le chèque avec une énumération en tant que réponse afin qu'une déclaration de changement puisse être utilisée lors de l'évaluation du résultat:

OsCheck.OSType ostype=OsCheck.getOperatingSystemType();
switch (ostype) {
    case Windows: break;
    case MacOS: break;
    case Linux: break;
    case Other: break;
}

La classe d'aide est:

/**
 * 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;
  }
}

32
2017-08-24 10:09



Les classes JavaFX suivantes ont des méthodes statiques pour déterminer le système d'exploitation actuel (isWindows (), isLinux () ...):

  • com.sun.javafx.PlatformUtil
  • com.sun.media.jfxmediaimpl.HostUtils
  • com.sun.javafx.util.Utils

Exemple:

if (PlatformUtil.isWindows()){
           ...
}

21
2017-12-15 22:32



Si vous êtes intéressé par la façon dont un projet open source fait ce genre de choses, vous pouvez consulter la classe Terracotta (Os.java) qui gère cette erreur ici:

Et vous pouvez voir une classe similaire pour gérer les versions de JVM (Vm.java et VmVersion.java) ici:


9
2017-10-23 04:37



    private static String OS = System.getProperty("os.name").toLowerCase();

    public static void detectOS() {
        if (isWindows()) {

        } else if (isMac()) {

        } else if (isUnix()) {

        } else {

        }
    }

    private static boolean isWindows() {
        return (OS.indexOf("win") >= 0);
    }

    private static boolean isMac() {
        return (OS.indexOf("mac") >= 0);
    }

    private static boolean isUnix() {
        return (OS.indexOf("nux") >= 0);
    }

8
2017-07-06 19:06



Disons que vous avez une classe Util pour ces fonctions utilitaires. Créez ensuite des énumérations publiques pour chaque type de système d'exploitation.

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;
    }
}

Ensuite, vous pouvez facilement invoquer la classe de n'importe quelle classe comme suit, (P.S. Comme nous avons déclaré la variable os comme statique, il ne consommera qu'une seule fois pour identifier le type de système, puis il pourra être utilisé jusqu'à ce que votre application s'arrête.)

            switch (Util.getOS()) {
            case WINDOWS:
                //do windows stuff
                break;
            case LINUX:

etc...


7
2017-07-21 19:02



Je trouve que le OS Utils de Swingx Fait le travail.


6
2017-10-23 04:40