Хорошо, я знаю это System.getProperty("os.name")
даст мне название ОС, под которой я работаю, но это много не помогает. То, что я должен знать, - то, если ОС, на которой я работаю, является 'подобная Unix' ОС, я не забочусь, является ли это HP-UX, AIX, Mac OS X или что бы то ни было.
Из списка возможных значений os.name кажется, что быстрый и грязный способ обнаружить 'подобную Unix' ОС проверяет если os.name
не содержит "Windows". Ложными положительными сторонами, которые дадут мне, являются Ose, с которыми очень вряд ли встретится мой код! Однако, я хотел бы знать лучший путь, если существует тот.
Я без проблем использовал вашу схему в производственном коде в 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.
Javadoc говорит: В UNIX-системах значение этого
* поле '/'
; в системах Microsoft Windows это ''
.
System.out.println( File.separatorChar == '/' ? "Unix" : "Windows" );
System.getProperty ("os.name");
- это лучшее, что вы собираетесь получить.
Используйте File.pathSeparator или File.separator. Первый вернет ";" в Windows и ":" в Unix. Второй вернет «\» в Windows и «/» в Unix.
File.listRoots()
даст вам массив корневых каталогов файловой системы.
Если вы работаете в Unix-подобной системе, то массив должен содержать одну запись "/"
, а в системах Windows вы получите что-то вроде ["C:", "D:", ...]
Edit: @chris_l: Я совсем забыл о мобильных телефонах. Покопавшись, выяснилось, что Android возвращает "/\0\0"
- слэш, за которым следуют два нулевых байта (предполагается, что это ошибка). Похоже, пока что мы избегаем ложных срабатываний благодаря удаче и совпадениям. К сожалению, не удалось найти хороших данных по другим телефонам.
Вероятно, не стоит запускать один и тот же код на настольных компьютерах и мобильных телефонах, но это интересно знать. Похоже, это сводится к необходимости проверки конкретных функций, а не просто типа системы.
Я согласен с @Fuzzy в том, что, по-моему, единственный способ, которым Java предполагала, что вы сможете получить эту информацию - это свойство os.name
.
Единственное, о чем я могу еще подумать:
Иметь сценарий оболочки или обертку пакетного файла для запуска вашего Java-приложения, который передает информацию об ОС с помощью аргумента -D
JVM. Хотя, учитывая ваше описание, это не кажется выполнимым.
Вы можете попробовать проверить существование каталога, специфичного для ОС. Например, можно предположить, что каталог "/"
всегда существует в Unix-подобной системе, но не в Windows, и сделать что-то вроде этого:
if((new File("/")).exists())) { System.out.println("Я нахожусь в Unix-системе!"); }
Попробуйте запустить специфичную для Unix команду командной строки, например ls
, и проверьте код возврата. Если она сработала, то вы находитесь на Unix-подобной системе, если нет, то на Windows.
Все эти решения на самом деле просто хаки, и, честно говоря, я не очень хорошо отношусь к любому из них. К сожалению, вам, вероятно, лучше всего придерживаться вашей оригинальной мысли. Весело, а?
Используйте класс 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) {
...
}
Простой, эффективный, легко читаемый, без криптографических уловок.
Вы можете попробовать выполнить команду uname
- она должна быть доступна во всех системах unixoid.