Я хотел бы определить операционную систему хоста, на котором моя Java-программа выполняется программно (например: я хотел бы иметь возможность загружать различные свойства в зависимости от того, нахожусь ли я на платформе Windows или Unix). Какой самый безопасный способ сделать это со 100% надежностью?
java
operating-system
karlgrz
источник
источник
Windows 10
и все жеos.name
отдает мнеWindows 8.1
. Это почему? Откуда это?Как указано в других ответах, System.getProperty предоставляет необработанные данные. Тем не менее, компонент Apache Commons Lang предоставляет оболочку для java.lang.System с удобными свойствами
SystemUtils.IS_OS_WINDOWS
, похожими на вышеупомянутую утилиту Swingx OS.источник
Октябрь 2008 г .:
Я бы порекомендовал кэшировать его в статической переменной:
Таким образом, каждый раз, когда вы запрашиваете Os, вы не получаете свойство более одного раза в течение срока действия вашего приложения.
Февраль 2016 года: 7+ лет спустя:
В Windows 10 есть ошибка (которой не было на момент первоначального ответа).
Смотрите " Java os.name" для Windows 10? "
источник
isWindows
,isUnix
и т.д. Таким образом , вы сэкономите на время сравнения строк тоже.некоторые ссылки в ответах выше не работают. Я добавил указатели к текущему исходному коду в приведенном ниже коде и предлагаю подход для обработки проверки с помощью перечисления в качестве ответа, чтобы можно было использовать оператор switch при оценке результата:
Вспомогательный класс:
источник
Следующие классы JavaFX имеют статические методы для определения текущей ОС (isWindows (), isLinux () ...):
Пример:
источник
TL; DR
Для доступа к использованию ОС:
System.getProperty("os.name")
.Но почему бы не создать служебный класс, сделать его многоразовым! И, вероятно, намного быстрее на несколько звонков. Чисто, понятно, быстрее!
Создайте класс Util для таких служебных функций. Затем создайте публичные перечисления для каждого типа операционной системы.
Теперь вы можете легко вызвать класс из любого класса следующим образом (PS Поскольку мы объявили переменную os как статическую, она потребует времени только один раз для определения типа системы, затем она может использоваться до тех пор, пока ваше приложение не остановится.)
и это все!
источник
Небольшой пример того, чего вы пытаетесь достичь, вероятно, будет
class
похож на то, что под ним:Эта конкретная реализация является достаточно надежной и должна быть универсально применимой. Просто скопируйте и вставьте его на ваш
class
выбор.источник
Если вам интересно, как проект с открытым исходным кодом делает подобные вещи, вы можете проверить класс Terracotta (Os.java), который обрабатывает этот мусор здесь:
http://svn.terracotta.org/svn/tc/dso/trunk/code/base/common/src/com/tc/util/runtime/И вы можете увидеть похожий класс для обработки версий JVM (Vm.java и VmVersion.java) здесь:
источник
toLowerCase
без указания локалиПопробуйте это, просто и легко
источник
Взято из этого проекта https://github.com/RishiGupta12/serial-communication-manager
источник
В приведенном ниже коде показаны значения, которые вы можете получить из системного API, все эти вещи вы можете получить через этот API.
Ответы: -
источник
Я считаю, что ОС Utils от Swingx делает свою работу.
источник
Я думаю, что следующее может дать более широкое освещение в меньшем количестве строк
Более подробная информация здесь: https://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html.
источник
источник
Вы можете просто использовать sun.awt.OSInfo # getOSType () метод
источник
Если вы работаете в среде, чувствительной к безопасности, пожалуйста, прочитайте это до конца.
Пожалуйста, воздержитесь от доверия к собственности, полученной с помощью
System#getProperty(String)
подпрограммы! На самом деле, почти все свойства, включаяos.arch
,os.name
иos.version
не только для чтения, как вы могли бы ожидать - вместо этого, они на самом деле совсем наоборот.Прежде всего, любой код с достаточным разрешением для вызова
System#setProperty(String, String)
подпрограммы может изменить возвращенный литерал по желанию. Тем не менее, это не обязательно основная проблема здесь, так как она может быть решена с помощью так называемогоSecurityManager
, как описано более подробно здесь .Фактическая проблема заключается в том, что любой пользователь может редактировать эти свойства при запуске соответствующего
JAR
вопроса. Это означает, что нет способа определить, являются ли эти свойства действительно точными. Из-за этого вот несколько дополнительных проверок, чтобы попытаться избежать вмешательства:Еще одна хорошая идея - проверить наличие каталогов, специфичных для операционной системы. Какой бы подход вы ни выбрали, помните, что язык Java предназначен для кроссплатформенности. Так почему бы тебе не попробовать сделать то же самое?
источник
Мне понравился ответ Вольфганга, просто потому, что я считаю, что такие вещи должны быть неприятностями ...
так что я немного перефразировал это для себя, и думал поделиться этим :)
источник
Этот код для отображения всей информации о типе ОС, имени, информации о Java и так далее.
источник
В классе com.sun.jna.Platform вы можете найти полезные статические методы, такие как
и многое другое.
Если вы используете Maven, просто добавьте зависимость
В противном случае просто найдите jar-файл библиотеки jna (например, jna-5.2.0.jar) и добавьте его в classpath.
источник
Просто используйте,
com.sun.javafx.util.Utils
как показано ниже.ИЛИ ИСПОЛЬЗОВАТЬ
источник