Как я могу обнаружить подобную Unix ОС в Java?

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

Из списка возможных значений os.name кажется, что быстрый и грязный способ обнаружить 'подобную Unix' ОС проверяет если os.name не содержит "Windows". Ложными положительными сторонами, которые дадут мне, являются Ose, с которыми очень вряд ли встретится мой код! Однако, я хотел бы знать лучший путь, если существует тот.

31
задан mluisbrown 19 July 2010 в 15:31
поделиться

8 ответов

Я без проблем использовал вашу схему в производственном коде в 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.

19
ответ дан 27 November 2019 в 21:43
поделиться

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

System.out.println( File.separatorChar == '/' ? "Unix" : "Windows" );
9
ответ дан 27 November 2019 в 21:43
поделиться

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

6
ответ дан 27 November 2019 в 21:43
поделиться

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

1
ответ дан 27 November 2019 в 21:43
поделиться

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

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

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

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

17
ответ дан 27 November 2019 в 21:43
поделиться

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

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

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

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

    if((new File("/")).exists())) { System.out.println("Я нахожусь в Unix-системе!"); }

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

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

1
ответ дан 27 November 2019 в 21:43
поделиться

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

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

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

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

if (SystemUtils.IS_OS_UNIX) {
    ...
}

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

33
ответ дан 27 November 2019 в 21:43
поделиться

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

-1
ответ дан 27 November 2019 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: