Я хотел бы определить операционную систему хоста, что моя программа Java работает программно (например: я хотел бы иметь возможность загружать разные свойства на основе того, нахожусь ли я на платформе Windows или Unix). Каков самый безопасный способ сделать это со 100% -ной надежностью?
Как программно определить операционную систему на Java?
Ответ 1
Вы можете использовать:
System.getProperty("os.name")
P.S. Вы можете найти этот код полезным:
class ShowProperties {
public static void main(String[] args) {
System.getProperties().list(System.out);
}
}
Все, что он делает, это распечатать все свойства, предоставляемые вашими реализациями Java. Это даст вам представление о том, что вы можете узнать о своей среде Java через свойства.: -)
Ответ 2
Как указано в других ответах, System.getProperty предоставляет необработанные данные. Тем не менее, компонент Apache Commons Lang предоставляет оболочку для java.lang.System с удобными свойствами, такими как SystemUtils.IS_OS_WINDOWS
, очень похожими на вышеупомянутую утилиту Swingx OS.
Ответ 3
Октябрь 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
}
Таким образом, каждый раз, когда вы запрашиваете Os, вы не получаете свойство более одного раза в течение срока действия вашего приложения.
Февраль 2016: 7+ лет спустя:
Существует ошибка с Windows 10 (которая не существовала во время первоначального ответа).
См. "Java "os.name" для Windows 10?
Ответ 4
System.getProperty("os.name")
Ответ 5
некоторые из ссылок в вышеприведенных ответах кажутся нарушенными. Я добавил указатели на текущий исходный код в приведенном ниже коде и предлагаю подход для обработки проверки с перечислением в качестве ответа, чтобы оператор 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;
}
}
Ответ 6
Следующие классы JavaFX имеют статические методы для определения текущей ОС (isWindows(), isLinux()...):
- com.sun.javafx.PlatformUtil
- com.sun.media.jfxmediaimpl.HostUtils
- com.sun.javafx.util.Utils
Пример:
if (PlatformUtil.isWindows()){
...
}
Ответ 7
Да, краткий ответ - использовать System.getProperty("os.name")
. Но почему бы не создать служебный класс, сделать его многоразовым! И, вероятно, намного быстрее на несколько звонков. Чисто, понятно, быстрее!
Создайте класс 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;
}
}
Теперь вы можете легко вызвать класс из любого класса следующим образом (PS Поскольку мы объявили переменную os как статическую, она потребует времени только один раз для определения типа системы, затем она может использоваться до тех пор, пока ваше приложение не остановится.)
switch (Util.getOS()) {
case WINDOWS:
//do windows stuff
break;
case LINUX:
и это все!
Ответ 8
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);
}
Ответ 9
Если вам интересно, как работает проект с открытым исходным кодом, вы можете проверить класс 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 (Vm.java и VmVersion.java) здесь:
Ответ 10
Взято из этого проекта 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 {
}
Ответ 11
Попробуйте это, просто и легко
System.getProperty("os.name");
System.getProperty("os.version");
System.getProperty("os.arch");
Ответ 12
Я обнаружил, что OS Utils из Swingx выполняет эту работу.
Ответ 13
Ниже код показывает значения, которые вы можете получить из System 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
\
Ответ 14
Я думаю, что следующее может дать более широкое освещение в меньшем количестве строк
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.
Ответ 15
String osName = System.getProperty("os.name");
System.out.println("Operating system " + osName);
Ответ 16
Мне понравился ответ Вольфганга, потому что я считаю, что такие вещи должны быть consts...
поэтому я немного перефразировал его для себя и решил поделиться им:)
/**
* 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;
}
}
Ответ 17
Вы можете просто использовать метод sun.awt.OSInfo # getOSType()
Ответ 18
Этот код для отображения всей информации о системе os типа, имени, 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));
}
}
Ответ 19
Вы можете получить имя типа ОС, используя
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
sun.boot.library.path =/USR/Library/JVM/Java-1.8.0-OpenJDK-1.8.0...
java.vm.version = 25,65-B01
java.vm.vendor = Корпорация Oracle
java.vendor.url = http://java.oracle.com/
path.separator =
java.vm.name = OpenBDK 64-разрядный сервер VM
file.encoding.pkg = sun.io
user.country = США
sun.java.launcher = SUN_STANDARD
sun.os.patch.level = неизвестен
java.vm.specification.name = спецификация виртуальной машины Java
user.dir =/веб/ком/1502258867_87863
java.runtime.version = 1.8.0_65-b17
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
java.endorsed.dirs =/USR/Library/JVM/Java-1.8.0-OpenJDK-1.8.0...
os.arch = amd64
java.io.tmpdir =/TMP
line.separator =
java.vm.specification.vendor = Корпорация Oracle
os.name = Linux
sun.jnu.encoding = UTF-8
java.library.path =/дом/CG/корень/GNUstep/Library/Librari...
java.specification.name = Спецификация API платформы Java
java.class.version = 52,0
sun.management.compiler = 64-разрядные многоуровневые компиляторы HotSpot
os.version = 3.10.0-327.4.4.el7.x86_64
user.home =/USR/доли/HTTPD
user.timezone =
java.awt.printerjob = sun.print.PSPrinterJob
file.encoding = UTF-8
java.specification.version = 1,8
user.name = апаша
java.class.path =/дом/CG/корень/GNUstep/Library/Librari...
java.vm.specification.version = 1,8
sun.arch.data.model = 64
java.home =/USR/Library/JVM/Java-1.8.0-OpenJDK-1.8.0...
sun.java.command = MyFirstJavaProgram
java.specification.vendor = Корпорация Oracle
user.language = еп
awt.toolkit = sun.awt.X11.XToolkit
java.vm.info = смешанный режим
java.version = 1.8.0_65
java.ext.dirs =/USR/Library/JVM/Java-1.8.0-OpenJDK-1.8.0...
sun.boot.class.path =/USR/Library/JVM/Java-1.8.0-OpenJDK-1.8.0...
java.vendor = Корпорация Oracle
File.separator =/
java.vendor.url.bug = http://bugreport.sun.com/bugreport/
sun.cpu.endian = мало
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.isalist =
Ответ 20
Все вышеприведенные ответы могут привести к фатальному недостатку в дизайне подпрограммы System#getProperty
!
Никогда, никогда не доверяйте свойствам os.name
, os.version
и os.arch
. Эти свойства на самом деле не предназначены только для чтения, как и следовало ожидать - вместо этого злоумышленник может легко вставить произвольный строковый литерал в них!
Например, на моем компьютере с Windows 10 следующий фрагмент кода фактически выведет строковый литерал "Linux", выполнив следующие действия:
public static void main(String[] args)
{
System.out.println(System.getProperty("os.name");
}
Теперь, после упаковки class
в исполняемый файл JAR
, мы можем продолжать и выполнять его, как показано ниже.
$ java -jar PATH.jar -Dos.name="Linux"
Таким образом, все ответы, приведенные выше, могут поставить под угрозу вашу программу, полагая, что она выполняется в совершенно неправильной ОС. Вы можете спросить себя сейчас, как можно решить эту проблему? Ну, на данный момент единственный способ исправить этот упущение - это вручную проверить параметры JVM во время выполнения.
Вот краткий пример того, как запросить эти свойства программно. Предположим, что вы добавили бы блок инициализации static
к первичному class
. Тогда следующий фрагмент кода будет препятствовать внешнему вмешательству свойства os.name
.
if (java.util.Arrays.toString(jdk.internal.misc.VM.getRuntimeArguments()).contains("Dos.name"))
{
throw new java.lang.InternalError("Please refrain from tampering with the \"os.name\" property.");
}
jdk.internal.misc.VM
class
не предназначен для использования public
. Следовательно, вы не должны использовать его в рабочем коде!
Ответ 21
В классе com.sun.jna.Platform вы можете найти полезные статические методы, такие как
Platform.isWindows();
Platform.is64Bit();
Platform.isIntel();
Platform.isARM();
и многое другое.
Если вы используете Maven, просто добавьте зависимость
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.2.0</version>
</dependency>
В противном случае просто найдите jar файл библиотеки jna (например, jna-5.2.0.jar) и добавьте его в classpath.
Ответ 22
Просто используйте com.sun.javafx.util.Utils
как com.sun.javafx.util.Utils
ниже.
if ( Utils.isWindows()){
// LOGIC HERE
}
ИЛИ ИСПОЛЬЗОВАТЬ
boolean isWindows = OSInfo.getOSType().equals(OSInfo.OSType.WINDOWS);
if (isWindows){
// YOUR LOGIC HERE
}