Как программно определить операционную систему в Java?
Я хотел бы определить операционную систему хоста, на котором моя программа Java работает программно (например: я хотел бы иметь возможность загружать различные свойства на основе того, нахожусь ли я на платформе Windows или Unix). Каков самый безопасный способ сделать это со 100% надежностью?
18 ответов:
Вы можете использовать:
System.getProperty("os.name")P. S. Вы могли найти этот код полезным:
class ShowProperties { public static void main(String[] args) { System.getProperties().list(System.out); } }все, что он делает, это распечатать все свойства, предоставляемые вашими реализациями Java. Это даст вам представление о том, что вы можете узнать о среде Java через свойства. : -)
Как указано в других ответах, система.getProperty предоставляет необработанные данные. Тем не менее, компонент Apache Commons Lang предоставляет обертка для java.ленг.Система С удобными свойствами, как SystemUtils.IS_OS_WINDOWS, так же, как вышеупомянутый Swingx OS util.
октября. 2008:
Я бы рекомендовал кэшировать его в статической переменной:
public static final class OsUtils { private static String OS = null; public static String getOsName() { if(OS == null) { OS = System.getProperty("os.name"); } return OS; } public static boolean isWindows() { return getOsName().startsWith("Windows"); } public static boolean isUnix() // and so on }таким образом, каждый раз, когда вы запрашиваете ОС, вы не получаете свойство более одного раза в течение всего срока службы вашего приложения.
февраль 2016: 7+ лет спустя:
есть ошибка с Windows 10 (которая не существовала на момент первоначального ответа).
Смотрите " Java "os.name" для Windows 10?"
некоторые ссылки в ответах выше, кажется, сломаны. Я добавил указатели на текущий исходный код в коде ниже и предлагаю подход для обработки проверки с перечислением в качестве ответа, чтобы оператор switch можно было использовать при оценке результата:
OsCheck.OSType ostype=OsCheck.getOperatingSystemType(); switch (ostype) { case Windows: break; case MacOS: break; case Linux: break; case Other: break; }вспомогательный класс-это:
/** * helper class to check the operating system this Java VM runs in * * please keep the notes below as a pseudo-license * * http://stackoverflow.com/questions/228477/how-do-i-programmatically-determine-operating-system-in-java * compare to 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 { /** * types of Operating Systems */ public enum OSType { Windows, MacOS, Linux, Other }; // cached result of OS detection protected static OSType detectedOS; /** * detect the operating system from the os.name System property and cache * the result * * @returns - the operating system detected */ 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; } }
следующие классы JavaFX имеют статические методы для определения текущей ОС (isWindows (), isLinux ()...):
- com.солнце.в JavaFX.PlatformUtil
- com.солнце.сми.jfxmediaimpl.HostUtils
- com.солнце.в JavaFX.утиль.Утилиты
пример:
if (PlatformUtil.isWindows()){ ... }
Если вас интересует, как проект с открытым исходным кодом делает такие вещи, вы можете проверить класс Terracotta (Os.java), который обрабатывает этот мусор здесь:
http://svn.terracotta.org/svn/tc/dso/trunk/code/base/common/src/com/tc/util/runtime/- http://svn.terracotta.org/svn/tc/dso/tags/2.6.4/code/base/common/src/com/tc/util/runtime/
и вы можете увидеть аналогичный класс для обработки JVM версии (ВМ.java и VmVersion.java) здесь:
private static String OS = System.getProperty("os.name").toLowerCase(); public static void detectOS() { if (isWindows()) { } else if (isMac()) { } else if (isUnix()) { } else { } } private static boolean isWindows() { return (OS.indexOf("win") >= 0); } private static boolean isMac() { return (OS.indexOf("mac") >= 0); } private static boolean isUnix() { return (OS.indexOf("nux") >= 0); }
взято из этого проекта https://github.com/RishiGupta12/serial-communication-manager
String osName = System.getProperty("os.name"); String osNameMatch = osName.toLowerCase(); if(osNameMatch.contains("linux")) { osType = OS_LINUX; }else if(osNameMatch.contains("windows")) { osType = OS_WINDOWS; }else if(osNameMatch.contains("solaris") || osNameMatch.contains("sunos")) { osType = OS_SOLARIS; }else if(osNameMatch.contains("mac os") || osNameMatch.contains("macos") || osNameMatch.contains("darwin")) { osType = OS_MAC_OS_X; }else { }
допустим, у вас есть класс Util для таких служебных функций. Затем создайте общие перечисления для каждого типа операционной системы.
public class Util { public enum OS { WINDOWS, LINUX, MAC, SOLARIS };// Operating systems. 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; } }затем вы можете легко вызвать класс из любого класса следующим образом(P.S. поскольку мы объявили переменную os как статическую, она будет потреблять время только один раз, чтобы определить тип системы, а затем ее можно использовать до тех пор, пока ваше приложение не остановится. )
switch (Util.getOS()) { case WINDOWS: //do windows stuff break; case LINUX:и так далее...
Я считаю, что OS Utils от Swingx делает работу.
попробуйте это, просто и легко
System.getProperty("os.name"); System.getProperty("os.version"); System.getProperty("os.arch");
ниже код показывает значения, которые вы можете получить от системного API, эти все вещи, которые вы можете получить через этот API.
public class App { public static void main( String[] args ) { //Operating system name System.out.println(System.getProperty("os.name")); //Operating system version System.out.println(System.getProperty("os.version")); //Path separator character used in java.class.path System.out.println(System.getProperty("path.separator")); //User working directory System.out.println(System.getProperty("user.dir")); //User home directory System.out.println(System.getProperty("user.home")); //User account name System.out.println(System.getProperty("user.name")); //Operating system architecture System.out.println(System.getProperty("os.arch")); //Sequence used by operating system to separate lines in text files System.out.println(System.getProperty("line.separator")); System.out.println(System.getProperty("java.version")); //JRE version number System.out.println(System.getProperty("java.vendor.url")); //JRE vendor URL System.out.println(System.getProperty("java.vendor")); //JRE vendor name System.out.println(System.getProperty("java.home")); //Installation directory for Java Runtime Environment (JRE) System.out.println(System.getProperty("java.class.path")); System.out.println(System.getProperty("file.separator")); } }ответы:-
Windows 7 6.1 ; C:\Users\user\Documents\workspace-eclipse\JavaExample C:\Users\user user amd64 1.7.0_71 http://java.oracle.com/ Oracle Corporation C:\Program Files\Java\jre7 C:\Users\user\Documents\workspace-Eclipse\JavaExample\target\classes \
Мне понравился ответ Вольфганга, просто потому, что я считаю, что такие вещи должны быть запорами...
Так я перефразировал его немного для себя, и думал поделиться этим :)
/** * types of Operating Systems * * please keep the note below as a pseudo-license * * helper class to check the operating system this Java VM runs in * http://stackoverflow.com/questions/228477/how-do-i-programmatically-determine-operating-system-in-java * compare to 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 */ public enum OSType { MacOS("mac", "darwin"), Windows("win"), Linux("nux"), Other("generic"); private static OSType detectedOS; private final String[] keys; private OSType(String... keys) { this.keys = keys; } private boolean match(String osKey) { for (int i = 0; i < keys.length; i++) { if (osKey.indexOf(keys[i]) != -1) return true; } return false; } public static OSType getOS_Type() { if (detectedOS == null) detectedOS = getOperatingSystemType(System.getProperty("os.name", Other.keys[0]).toLowerCase()); return detectedOS; } private static OSType getOperatingSystemType(String osKey) { for (OSType osType : values()) { if (osType.match(osKey)) return osType; } return Other; } }
Вы можете получить имя типа ОС с помощью
System.out.println(System.getProperty("os.name"));вы можете получить всю информацию, связанную с ОС:
public class MyFirstJavaProgram { public static void main(String []args) { System.getProperties().list(System.out); } }Он будет выводить очень много деталей
свойства-- листинг --
java. runtime. name=OpenJDK Runtime Environment
солнце.сапог.библиотека.path=/usr/lib/jvm / java-1.8.0-openjdk-1.8.0...
java.виртуальная память.версия=25.65-b01
java.виртуальная память.поставщик=Oracle Корпорация
java. vendor. url=http://java.oracle.com/
путь.разделитель=:
java.vm. name=OpenJDK 64-разрядный сервер VM
file.encoding.pkg=sun.io
пользователей.Страна=США
солнце.Ява.launcher=SUN_STANDARD
солнце.ОС.заплатка.уровень=неизвестно!--3-->
Ява.ВМ.спецификация.имя=виртуальная машина Java Спецификация
пользователей.dir= / web / com / 1502258867_87863
java.во время выполнения.версия=1.8.0_65-b17
java.ОУ.graphicsenv=солнце.ОУ.X11GraphicsEnvironment
java.одобренный.dirs=/usr/lib/jvm / java-1.8.0-openjdk-1.8.0...
ОС.arch=amd64
java. io. tmpdir= / tmp
линии.разделитель=
java.виртуальная память.спецификация.поставщик=Oracle Корпорация
os. name=Linux
солнце.jnu.кодировка=кодировка UTF-8
java.библиотека.path=/home/cg/root/GNUstep/Library / Librari...
Ява.спецификация.имя=платформы Java спецификация API
java.класс.версия=52.0
солнце.управление.компилятор=HotSpot 64-разрядный многоуровневый Корпорация
пользователей.language=en
awt.инструментарий=солнце.ОУ.Х11.XToolkit
java.vm. info=смешанный режим
java.версия=1.8.0_65
java.доб.dirs=/usr/lib/jvm / java-1.8.0-openjdk-1.8.0...
солнце.сапог.класс.path=/usr/lib/jvm / java-1.8.0-openjdk-1.8.0...
java.поставщик=Oracle Корпорация
.разделитель=/java. vendor. url. bug=http://bugreport.sun.com/bugreport/
солнце.ЦП.эндиан=маленький
sun.io. unicode. encoding=UnicodeLittle
солнце.ЦП.isalist=
этот код для отображения всей информации о типе ОС системы, имени, информации java и так далее.
public static void main(String[] args) { // TODO Auto-generated method stub Properties pro = System.getProperties(); for(Object obj : pro.keySet()){ System.out.println(" System "+(String)obj+" : "+System.getProperty((String)obj)); } }
Я думаю, что следующее может дать более широкий охват в меньшем количестве строк
import org.apache.commons.exec.OS; if (OS.isFamilyWindows()){ //load some property } else if (OS.isFamilyUnix()){ //load some other property }подробнее здесь: https://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html
Comments