web-dev-qa-db-fra.com

Comment détecter un système d'exploitation de type Unix en Java?

Ok, je sais que System.getProperty("os.name") me donnera le nom du système d’exploitation sous lequel j’exécute, mais ce n’est pas très utile. Ce que je dois savoir, c’est que si le système d’exploitation sur lequel j’exécute est un système «de type Unix», peu importe que ce soit HP-UX, AIX, Mac OS X ou autre.

D'après la liste des valeurs os.name possibles }, il semble qu'un moyen rapide et sale de détecter un système d'exploitation de type "Unix" vérifie si os.name fait pas contient "Windows". Les faux positifs qui me donneront sont les systèmes d'exploitation que mon code est très peu probable! Néanmoins, j'aimerais connaître une meilleure solution s'il en existe une.

31
mluisbrown

J'ai utilisé votre schéma dans le code de production sous Windows XP, Vista, Win7, Mac OS 10.3 - 10.6 et une variété de distributions Linux sans problème:

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

Essentiellement, détectez Unix-like by not detecting Windows.

19
David J. Liszewski

Utilisez la classe org.Apache.commons.lang.SystemUtils utility de Commons Lang, elle a une constante Nice IS_OS_UNIX . Du javadoc:

true s’il s’agit d’un système compilant POSIX, comme sous AIX, HP-UX, Irix, Linux, MacOSX, Solaris ou Sun.

Le champ retournera false si OS_NAME est null.

Et le test devient:

if (SystemUtils.IS_OS_UNIX) {
    ...
}

Simple, efficace, facile à lire, pas d’astuces cryptiques.

33
Pascal Thivent

File.listRoots() vous donnera un tableau des répertoires racine du système de fichiers.

Si vous êtes sur un système de type Unix, le tableau devrait contenir une seule entrée "/" et sur les systèmes Windows, vous obtiendrez quelque chose comme ["C:", "D:", ...].

Modifier: @chris_l: J'ai totalement oublié les téléphones mobiles. En fouillant, Android renvoie un "/\0\0" - une barre oblique suivie de deux octets nuls (supposé être un bogue). On dirait que nous évitons les faux positifs pour le moment par chance et par hasard. Impossible de trouver de bonnes données sur d'autres téléphones, malheureusement.

Ce n'est probablement pas une bonne idée d'exécuter le même code sur les ordinateurs de bureau et les téléphones mobiles, mais il est intéressant de le savoir. On dirait que cela revient à devoir vérifier certaines fonctionnalités plutôt que simplement le type de système.

17
MikeD

Javadoc dit: Sur les systèmes UNIX, la valeur de ce champ * est '/'; sur les systèmes Microsoft Windows, il s'agit de '\'.

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

System.getProperty("os.name"); est le meilleur que vous puissiez obtenir.

6
user177800

Utilisez File.pathSeparator ou File.separator. Le premier reviendra ";" sous Windows et ":" sous Unix. Le second retournera "\" sous Windows et "/" sous Unix.

1
Greg Mallett

Je suis d'accord avec @Fuzzy en ce que je pense que la seule façon pour Java de vous permettre d'obtenir ces informations a été d'utiliser la propriété os.name.

Les seules autres choses auxquelles je peux penser sont:

  1. Utilisez un script shell ou un encapsuleur pour lancer votre application Java qui transmet les informations du système d'exploitation à l'aide de l'argument -D de la machine virtuelle Java. Bien que vu votre description, cela ne semble pas faisable.

  2. Vous pouvez essayer de vérifier l'existence d'un répertoire spécifique au système d'exploitation. Par exemple, vous pouvez supposer que le répertoire "/" existera toujours sur un système de type Unix, mais pas sous Windows, et procédera comme ceci:

    if ((new File ("/")). exist ()) {System.out.println ("Je suis sur un système Unix!"); }

  3. Essayez de lancer une commande en ligne de commande spécifique à Unix telle que ls et vérifiez le code de retour. Si cela a fonctionné, vous êtes sur un système de type Unix, sinon vous êtes sur Windows.

Toutes ces solutions ne sont cependant que des bidouilles et, franchement, je ne me sens vraiment pas très bien avec l'une d'elles. Vous êtes probablement probablement mieux avec votre pensée originale. Amusant, hein?

1
Brent Writes Code

C'est une vieille question à poser, mais vous pouvez quand même utiliser ceci: System.getProperty("os.name").toLowerCase();

0
neo7