Как я могу обнаружить Unix-подобную ОС в Java? - PullRequest
31 голосов
/ 19 июля 2010

Хорошо, я знаю, что System.getProperty("os.name") даст мне название ОС, под которой я работаю, но это не очень помогает.Мне нужно знать, является ли ОС, на которой я работаю, «Unix-подобной» ОС, мне все равно, HP-UX, AIX, Mac OS X и т. Д.

Из список возможных значений os.name кажется, что быстрый и грязный способ обнаружения «Unix-подобной» ОС проверяет, содержит ли os.name не «Windows».Ложные срабатывания, которые мне дадут, - это операционные системы, с которыми мой код вряд ли столкнется!Тем не менее, я бы хотел узнать лучший способ, если он есть.

Ответы [ 10 ]

33 голосов
/ 19 июля 2010

Используйте служебный класс org.apache.commons.lang.SystemUtils от Commons Lang, у него хорошая константа IS_OS_UNIX.Из javadoc:

Is true, если это система, совместимая с POSIX, как в любой из AIX, HP-UX, Irix, Linux, MacOSX, Solaris или SUN OS.

Поле вернет false, если OS_NAME имеет значение null.

И тест становится:

if (SystemUtils.IS_OS_UNIX) {
    ...
}

Простой, эффективный, легко читаемый, без зашифрованных трюков.

19 голосов
/ 19 июля 2010

Я использовал вашу схему в рабочем коде для Windows XP, Vista, Win7, Mac OS 10.3 - 10.6 и различных дистрибутивов Linux без проблем:

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

По сути, обнаружение Unix-подобных по не обнаружение Windows.

17 голосов
/ 19 июля 2010

File.listRoots() предоставит вам массив корневых каталогов файловой системы.

Если вы работаете в Unix-подобной системе, тогда массив должен содержать одну запись "/" а в системах Windows вы получите что-то вроде ["C:", "D:", ...]

Редактировать: @chris_l: Я совершенно забыл о мобильных телефонах.Некоторые раскопки показывают, что Android возвращает "/\0\0" - косую черту, за которой следуют два нулевых байта (предполагается, что это ошибка).Похоже, мы пока избегаем ложных срабатываний благодаря удаче и совпадениям.К сожалению, не удалось найти хорошие данные на других телефонах.

Вероятно, не очень хорошая идея запускать один и тот же код на настольных компьютерах и мобильных телефонах, но это интересно знать.Похоже, все сводится к необходимости проверять определенные функции, а не просто тип системы.

9 голосов
/ 19 июля 2010

Javadoc говорит: в системах UNIX значение этого * поле '/'; в системах Microsoft Windows это '\'.

System.out.println( File.separatorChar == '/' ? "Unix" : "Windows" );
6 голосов
/ 19 июля 2010

System.getProperty("os.name"); - это лучшее, что вы получите.

1 голос
/ 19 июля 2010

Используйте File.pathSeparator или File.separator. Первый вернется ";" в Windows и ":" в Unix. Второй вернет «\» в Windows и «/» в Unix.

1 голос
/ 19 июля 2010

Я согласен с @Fuzzy в том, что я думаю, что единственный способ, которым Java предназначала вас для получения этой информации, был через свойство os.name.

Единственное, о чем я могу думать, это:

  1. Наличие сценария оболочки или оболочки командного файла для запуска приложения Java, которое передает информацию об ОС с помощью аргумента -D в JVM.Хотя, учитывая ваше описание, это не звучит выполнимо.

  2. Вы можете попытаться проверить наличие каталога для конкретной ОС.Например, вы можете предположить, что каталог "/" всегда будет существовать в Unix-подобной системе, но не в Windows, и делать что-то вроде этого:

    if ((новый файл ("/")). Существует()) {System.out.println («Я в системе Unix!»);}

  3. Попробуйте запустить специальную команду командной строки Unix, например ls, и проверьте код возврата.Если это сработало, вы работаете в Unix-подобной системе, если не на Windows.

Все эти решения на самом деле просто взломаны, и, честно говоря, я не оченьчувствую все это замечательно к любому из них.Тебе, к сожалению, вероятно, лучше всего с твоей оригинальной мыслью.Веселье, а?

0 голосов
/ 23 октября 2013

Это довольно старый вопрос, но все же вы можете использовать это: System.getProperty("os.name").toLowerCase();

0 голосов
/ 05 февраля 2013
package com.appspot.x19290;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class UnixCheck {
    public static void main(String[] args) {
        UnixCheck s = UnixCheck.S;
        String isUnix = s.unix ? "is Unix" : "not Unix";
        try {
            System.out.println(isUnix + ", devnull: " + s.devnull.getPath());
        } catch (NullPointerException e) {
            System.out.println(isUnix + ", devnull: unknown");
        }
    }

    public static final UnixCheck S = new UnixCheck();
    public static final UnixCheck TEST = new UnixCheck(true);

    public final boolean unix;
    public final File devnull;

    private UnixCheck() {
        this(false);
    }

    private UnixCheck(boolean testing) {
        String path;
        path = testing ? "/<dev>/<no><such><null><device>" : "/dev/null";
        File devnull = devnullOrNone(path);
        if (devnull == null) {
            this.unix = false;
            path = testing ? "<no><such><null><device>" : "nul";
            this.devnull = devnullOrNone(path);
        } else {
            this.unix = true;
            this.devnull = devnull;
        }
    }

    private static File devnullOrNone(String name) {
        File file = new File(name);
        if (file.isFile())
            return null;
        if (file.isDirectory())
            return null;
        try {
            FileInputStream i = new FileInputStream(file);
            try {
                i.read();
            } finally {
                i.close();
            }
        } catch (IOException e) {
            return null;
        }
        return file;
    }
}
0 голосов
/ 19 июля 2010

Вы можете попытаться выполнить команду uname - должна быть доступна во всех системах unixoid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...