Как программно определить операционную систему в Java?
Я хотел бы программно определить операционную систему хоста, на котором работает моя программа на Java (например, мне нужно загружать разные свойства в зависимости от того, работаю ли я на платформе Windows или Unix). Какой самый надежный способ сделать это с 100% гарантией?
5 ответ(ов)
Вы можете использовать следующий код для получения имени операционной системы:
System.getProperty("os.name");
P.S. Вам может быть полезен следующий код:
class ShowProperties {
public static void main(String[] args) {
System.getProperties().list(System.out);
}
}
Этот код просто выводит все свойства, предоставленные вашей Java-реализацией. Это даст вам представление о том, какую информацию вы можете узнать о вашей Java-среде через свойства. 😃
Некоторые ссылки в вышеприведенных ответах, похоже, не работают. Я добавил указания на актуальный исходный код в приведенном ниже коде и предлагаю подход для проверки с помощью перечисления (enum), что позволит использовать оператор switch
при оценке результата:
OsCheck.OSType ostype = OsCheck.getOperatingSystemType();
switch (ostype) {
case Windows:
break;
case MacOS:
break;
case Linux:
break;
case Other:
break;
}
Вспомогательный класс выглядит следующим образом:
/**
* Вспомогательный класс для проверки операционной системы, в которой работает эта Java VM
*
* Пожалуйста, сохраняйте заметки ниже в качестве псевдо-лицензии
*
* http://stackoverflow.com/questions/228477/how-do-i-programmatically-determine-operating-system-in-java
* сравните с http://svn.terracotta.org/svn/tc/dso/tags/2.6.4/code/base/common/src/com/tc/util/runtime/Os.java
* http://www.docjar.com/html/api/org/apache/commons/lang/SystemUtils.java.html
*/
import java.util.Locale;
public static final class OsCheck {
/**
* Типы операционных систем
*/
public enum OSType {
Windows, MacOS, Linux, Other
};
// кэшированный результат детекции ОС
protected static OSType detectedOS;
/**
* Определить операционную систему по системному свойству os.name и кэшировать
* результат
*
* @returns - обнаруженная операционная система
*/
public static OSType getOperatingSystemType() {
if (detectedOS == null) {
String OS = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH);
if ((OS.indexOf("mac") >= 0) || (OS.indexOf("darwin") >= 0)) {
detectedOS = OSType.MacOS;
} else if (OS.indexOf("win") >= 0) {
detectedOS = OSType.Windows;
} else if (OS.indexOf("nux") >= 0) {
detectedOS = OSType.Linux;
} else {
detectedOS = OSType.Other;
}
}
return detectedOS;
}
}
Этот код позволяет программно определять операционную систему и обрабатывать результаты с помощью switch
-оператора, что делает его более читаемым и управляемым.
Кратко:
Для получения информации о операционной системе используйте: System.getProperty("os.name")
.
Но ПОДОЖДИТЕ!!!
Почему бы не создать утилитный класс, чтобы сделать его многократно используемым и, вероятно, значительно быстрее при множественных вызовах? Чисто, понятно, быстро!
Создайте класс Util для таких утилитарных функций. Затем создайте публичные перечисления для каждого типа операционной системы.
public class Util {
public enum OS {
WINDOWS, LINUX, MAC, SOLARIS
} // Операционные системы.
private static OS os = null;
public static OS getOS() {
if (os == null) {
String operSys = System.getProperty("os.name").toLowerCase();
if (operSys.contains("win")) {
os = OS.WINDOWS;
} else if (operSys.contains("nix") || operSys.contains("nux")
|| operSys.contains("aix")) {
os = OS.LINUX;
} else if (operSys.contains("mac")) {
os = OS.MAC;
} else if (operSys.contains("sunos")) {
os = OS.SOLARIS;
}
}
return os;
}
}
Теперь вы можете легко вызывать этот класс из любого другого класса, как показано ниже (примечание: поскольку мы объявили переменную os
как статическую, она будет определять тип системы только один раз, а затем может использоваться до прекращения работы вашего приложения).
switch (Util.getOS()) {
case WINDOWS:
// действия для Windows
break;
case LINUX:
// действия для Linux
break;
// и так далее
Вот и всё!
В JavaFX имеются статические методы для определения текущей операционной системы в следующих классах:
com.sun.javafx.PlatformUtil
com.sun.media.jfxmediaimpl.HostUtils
com.sun.javafx.util.Utils
Вы можете использовать их следующим образом:
if (PlatformUtil.isWindows()) {
// Действия для Windows
} else if (PlatformUtil.isLinux()) {
// Действия для Linux
} else if (PlatformUtil.isMac()) {
// Действия для macOS
}
Эти методы позволяют вам определять операционную систему, на которой запущено ваше приложение, и выполнять соответствующие действия. Обратите внимание, что использование классов из пакета com.sun
может не быть рекомендуемым, так как они не являются частью публичного API и могут изменяться в будущих версиях JavaFX.
Вот небольшой пример, который может помочь вам в реализации вашей задачи. Рассмотрите класс, который выглядит примерно так:
import java.util.Locale;
public class OperatingSystem
{
private static String OS = System.getProperty("os.name", "unknown").toLowerCase(Locale.ROOT);
public static boolean isWindows()
{
return OS.contains("win");
}
public static boolean isMac()
{
return OS.contains("mac");
}
public static boolean isUnix()
{
return OS.contains("nux");
}
}
Эта реализация довольно надежна и должна работать в большинстве случаев. Просто скопируйте и вставьте этот код в ваш класс.
Инициализация ArrayList в одну строчку
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Eclipse/Java: не работает автозавершение кода
Как объявить массив в одну строку?
Загрузка JDK Java на Linux через wget приводит к отображению страницы лицензии вместо установки