saber - ¿Cómo determino programáticamente el sistema operativo en Java?
java saber sistema operativo (18)
Me gustaría determinar el sistema operativo del host que mi programa Java está ejecutando mediante programación (por ejemplo: me gustaría poder cargar diferentes propiedades según si estoy en una plataforma Windows o Unix) ¿Cuál es la forma más segura de hacerlo con una fiabilidad del 100%?
Algunos de los enlaces en las respuestas anteriores parecen estar rotos. He agregado punteros al código fuente actual en el código a continuación y ofrezco un enfoque para manejar el cheque con una enumeración como una respuesta para que se pueda usar una declaración de cambio al evaluar el resultado:
OsCheck.OSType ostype=OsCheck.getOperatingSystemType();
switch (ostype) {
case Windows: break;
case MacOS: break;
case Linux: break;
case Other: break;
}
La clase de ayuda es:
/**
* helper class to check the operating system this Java VM runs in
*
* please keep the notes below as a pseudo-license
*
* http://.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;
}
}
Como se indica en otras respuestas, System.getProperty proporciona los datos en bruto. Sin embargo, el componente Apache Commons Lang proporciona un envoltorio para java.lang.System con propiedades útiles como SystemUtils.IS_OS_WINDOWS , al igual que el utilitario Swingx OS mencionado anteriormente.
Creo que seguir puede dar una cobertura más amplia en menos líneas.
import org.apache.commons.exec.OS;
if (OS.isFamilyWindows()){
//load some property
}
else if (OS.isFamilyUnix()){
//load some other property
}
Más detalles aquí: https://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html
Digamos que tienes una clase de Util para tales funciones de utilidad. A continuación, cree enumeraciones públicas para cada tipo de sistema operativo.
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;
}
}
Luego, puede invocar fácilmente la clase de cualquier clase de la siguiente manera, (PS Como la variable os declaramos como estática, solo tomará tiempo una vez para identificar el tipo de sistema, luego se puede usar hasta que la aplicación se detenga).
switch (Util.getOS()) {
case WINDOWS:
//do windows stuff
break;
case LINUX:
y así...
El código a continuación muestra los valores que puede obtener de la API del sistema, todas estas cosas que puede obtener a través de esta 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"));
}
}
Respuestas: -
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
/
Encuentro que los Utils del sistema operativo de Swingx hacen el trabajo.
Este código para mostrar toda la información sobre el tipo de sistema operativo, el nombre, la información de Java, etc.
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));
}
}
Las siguientes clases de JavaFX tienen métodos estáticos para determinar el sistema operativo actual (isWindows (), isLinux () ...):
- com.sun.javafx.PlatformUtil
- com.sun.media.jfxmediaimpl.HostUtils
- com.sun.javafx.util.Utils
Ejemplo:
if (PlatformUtil.isWindows()){
...
}
Me gustó la respuesta de Wolfgang, solo porque creo que ese tipo de cosas deberían ser consts ...
así que lo he reformulado un poco para mí, y pensé en compartirlo :)
/**
* 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://.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;
}
}
Octubre de 2008:
Yo recomendaría cachearlo en una variable estática:
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
}
De esa manera, cada vez que solicite la O, no obtendrá la propiedad más de una vez en la vida de su aplicación.
Febrero 2016: 7+ años después:
Hay un error con Windows 10 (que no existía en el momento de la respuesta original).
Consulte " ¿os.name de Java para Windows 10? "
Prueba esto, simple y facil
System.getProperty("os.name");
System.getProperty("os.version");
System.getProperty("os.arch");
Puede obtener el nombre del tipo de SO usando
System.out.println(System.getProperty("os.name"));
Puede obtener toda la información relacionada con el sistema operativo por:
public class MyFirstJavaProgram {
public static void main(String []args) {
System.getProperties().list(System.out); } }
Saldrá muchos detalles.
- listado de propiedades -
java.runtime.name = OpenJDK Runtime Environment
sun.boot.library.path = / usr / lib / jvm / java-1.8.0-openjdk-1.8.0 ...
java.vm.version = 25.65-b01
java.vm.vendor = Oracle Corporation
java.vendor.url = http://java.oracle.com/
path.separator =:
java.vm.name = OpenJDK VM de servidor de 64 bits
file.encoding.pkg = sun.io
user.country = US
sun.java.launcher = SUN_STANDARD
sun.os.patch.level = desconocido
java.vm.specification.name = Especificación de máquina virtual Java
usuario.dir = / web / com / 1502258867_87863
java.runtime.version = 1.8.0_65-b17
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
java.endorsed.dirs = / usr / lib / jvm / java-1.8.0-openjdk-1.8.0 ...
os.arch = amd64
java.io.tmpdir = / tmp
line.separator =
java.vm.specification.vendor = Oracle Corporation
os.name = Linux
sun.jnu.encoding = UTF-8
java.library.path = / home / cg / root / GNUstep / Library / Librari ...
java.specification.name = Especificación de la API de la plataforma Java
java.class.version = 52.0
sun.management.compiler = HotSpot Compiladores en niveles de 64 bits
os.version = 3.10.0-327.4.4.el7.x86_64
user.home = / usr / share / httpd
user.timezone =
java.awt.printerjob = sun.print.PSPrinterJob
file.encoding = UTF-8
java.specification.version = 1.8
user.name = apache
java.class.path = / home / cg / root / GNUstep / Library / Librari ...
java.vm.specification.version = 1.8
sun.arch.data.model = 64
java.home = / usr / lib / jvm / java-1.8.0-openjdk-1.8.0 ...
sun.java.command = MyFirstJavaProgram
java.specification.vendor = Oracle Corporation
user.language = en
awt.toolkit = sun.awt.X11.XToolkit
java.vm.info = modo mixto
java.version = 1.8.0_65
java.ext.dirs = / usr / lib / jvm / java-1.8.0-openjdk-1.8.0 ...
sun.boot.class.path = / usr / lib / jvm / java-1.8.0-openjdk-1.8.0 ...
java.vendor = Oracle Corporation
file.separator = /
java.vendor.url.bug = http://bugreport.sun.com/bugreport/
sun.cpu.endian = poco
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.isalist =
Puedes usar:
System.getProperty("os.name")
PS Puede que este código te sea útil:
class ShowProperties {
public static void main(String[] args) {
System.getProperties().list(System.out);
}
}
Todo lo que hace es imprimir todas las propiedades proporcionadas por sus implementaciones de Java. Le dará una idea de lo que puede averiguar sobre su entorno Java a través de las propiedades. :-)
Si está interesado en cómo un proyecto de código abierto hace cosas como esta, puede consultar la clase de terracota (Os.java) que maneja esta basura aquí:
-
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/
Y puedes ver una clase similar para manejar versiones JVM (Vm.java y VmVersion.java) aquí:
Solo puedes usar el método sun.awt.OSInfo # getOSType ()
Tomado de este proyecto 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 {
}
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);
}
String osName = System.getProperty("os.name");
System.out.println("Operating system " + osName);