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 en función de si estoy en una plataforma Windows o Unix). ¿Cuál es la forma más segura de hacer esto con 100% de confiabilidad?
java
operating-system
karlgrz
fuente
fuente
Windows 10
y aúnos.name
me daWindows 8.1
. ¿Porqué es eso? ¿De dónde viene esto?Como se indica en otras respuestas, System.getProperty proporciona los datos sin procesar. Sin embargo, el componente Lang de Apache Commons proporciona un contenedor para java.lang.System con propiedades útiles como
SystemUtils.IS_OS_WINDOWS
, muy similar a la mencionada utilidad Swingx OS.fuente
Octubre de 2008:
Recomendaría almacenarlo en caché en una variable estática:
De esa manera, cada vez que solicita el sistema operativo, no obtiene la propiedad más de una vez durante la vida útil de su aplicación.
Febrero de 2016: más de 7 años después:
Hay un error con Windows 10 (que no existía en el momento de la respuesta original).
Consulte " Java" os.name "para Windows 10? "
fuente
isWindows
,isUnix
, etc. De esa manera ahorrar en el tiempo de comparación de cadenas también.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 la verificación con una enumeración como respuesta para que se pueda usar una declaración de cambio al evaluar el resultado:
La clase auxiliar es:
fuente
Las siguientes clases JavaFX tienen métodos estáticos para determinar el sistema operativo actual (isWindows (), isLinux () ...):
Ejemplo:
fuente
TL; DR
Para acceder a su uso OS:
System.getProperty("os.name")
.Pero, ¿por qué no crear una clase de utilidad, hacerla reutilizable! Y probablemente mucho más rápido en múltiples llamadas. ¡Limpio, claro, más rápido!
Cree una clase Util para tales funciones de utilidad. Luego, cree enumeraciones públicas para cada tipo de sistema operativo.
Ahora, puede invocar fácilmente la clase desde cualquier clase de la siguiente manera, (PD: ya que declaramos la variable os como estática, consumirá tiempo solo una vez para identificar el tipo de sistema, luego se puede usar hasta que su aplicación se detenga).
¡y eso es todo!
fuente
Un pequeño ejemplo de lo que está tratando de lograr probablemente sería
class
similar a lo que hay debajo:Esta implementación particular es bastante confiable y debería ser universalmente aplicable. Simplemente cópielo y péguelo en su
class
elección.fuente
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/Y puede ver una clase similar para manejar versiones JVM (Vm.java y VmVersion.java) aquí:
fuente
toLowerCase
sin especificar una ubicaciónPrueba esto, simple y fácil
fuente
Tomado de este proyecto https://github.com/RishiGupta12/serial-communication-manager
fuente
El siguiente código muestra los valores que puede obtener de la API del sistema, todo lo que puede obtener a través de esta API.
Respuestas: -
fuente
Encuentro que las utilidades del sistema operativo de Swingx hacen el trabajo.
fuente
Creo que seguir puede dar una cobertura más amplia en menos líneas
Más detalles aquí: https://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html
fuente
fuente
Puede usar el método sun.awt.OSInfo # getOSType ()
fuente
Si está trabajando en un entorno sensible a la seguridad, lea esto detenidamente.
¡Abstenerse de confiar en una propiedad obtenida a través de la
System#getProperty(String)
subrutina! En realidad, casi todas las propiedadesos.arch
, incluidosos.name
, yos.version
no son de solo lectura como cabría esperar; en cambio, en realidad son todo lo contrario.En primer lugar, cualquier código con permiso suficiente para invocar la
System#setProperty(String, String)
subrutina puede modificar el literal devuelto a voluntad. Sin embargo, ese no es necesariamente el problema principal aquí, ya que se puede resolver mediante el uso de un llamadoSecurityManager
, como se describe en mayor detalle aquí .El problema real es que cualquier usuario puede editar estas propiedades cuando ejecuta el
JAR
en cuestión. Esto significa que no hay forma de determinar si estas propiedades son realmente precisas. Debido a esto, aquí hay algunas comprobaciones adicionales para tratar de evitar la manipulación:Otra buena idea es verificar la presencia de directorios específicos del sistema operativo. Cualquiera que sea el enfoque que tome, recuerde que el lenguaje Java está diseñado para ser la plataforma cruzada. Entonces, ¿por qué no intentas hacer lo mismo?
fuente
Me gustó la respuesta de Wolfgang, solo porque creo que cosas así deberían ser const ...
así que lo reformulé un poco para mí y pensé en compartirlo :)
fuente
Este código para mostrar toda la información sobre el tipo de sistema operativo, nombre, información de Java, etc.
fuente
En la clase com.sun.jna.Platform puedes encontrar métodos estáticos útiles como
y mucho más.
Si usa Maven simplemente agregue dependencia
De lo contrario, solo busque el archivo jar de la biblioteca jna (por ejemplo, jna-5.2.0.jar) y agréguelo a classpath.
fuente
Solo use
com.sun.javafx.util.Utils
como a continuación.O USAR
fuente