gratis - "Os.name" de Java para Windows 10?
java 8 (3)
Este es definitivamente un error conocido. Ocurre porque la propiedad os.name
obtiene su valor de GetVersionEx
en el código fuente de la API de Windows. GetVersionEx
sin embargo,
puede estar alterado o no disponible para lanzamientos después de Windows 8.1
Según el sitio web oficial de Microsoft. En su lugar, necesitaremos usar el IsWindows10OrGreater
encuentra en las funciones de la API de Version Helper en el archivo versionhelpers.h
. Sin embargo, como ya habrás adivinado, este archivo no es un archivo Java, está escrito en C. Como resultado, debemos incluirlo de una manera un tanto indirecta. Requiere bastante trabajo (necesita programar en JNI: /) pero este tutorial lo ayudará a hacerlo. Otra solución se muestra en este registro de errores , y requiere menos esfuerzo.
En Java, podemos ver el valor de la propiedad de os.name
para conocer el nombre del sistema operativo subyacente: System.getProperty("os.name")
.
Para cada edición de Windows, solía devolver siempre el nombre exacto del sistema operativo: Windows XP
para XP, Windows Vista
para Vista, Windows 7
para Seven, Windows 8.1
para 8.1, y así sucesivamente ...
El problema es que acabo de actualizar mi Windows 8.1 a Windows 10 utilizando el actualizador de Microsoft, y parece que esta propiedad sigue siendo Windows 8.1
:
public class OSTest {
public static void main(String[] args) {
System.out.println(System.getProperty("os.name"));
}
}
¿Cómo puedo crear una solución para esto? Y, ¿alguien sabe si este problema persiste si instala una nueva copia de Windows 10, es decir, este error es causado por el actualizador automático de Microsoft?
Este es un problema conocido JDK-8066504 que se ha corregido en la próxima actualización de Java 8 60.
El motivo es que la función GetVersionEx ha cambiado su comportamiento desde Windows 8.1.
Hay varias soluciones posibles, consulte el artículo de MSDN .
El más trivial es ejecutar cmd.exe /c ver
.
El otro es mirar la información de versión de uno de los archivos del sistema, por ejemplo kernel32.dll
.
También podría usar el método .contains()
y simplemente verificar la cadena "windows" tal vez a lo largo de las líneas de
if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains(windows version here [xp, 7, 8, etc]))){}
Si necesita la versión de Windows, puede verificar todas las versiones y luego asumir 8.1 o 10 para moverse por el error.
if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("xp")){
//code for windows xp }
else if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("vista")){
//code for windows vista
else if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("7")){
//code for windows 7}
else if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("8")){
//code for windows 8}
else if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("8.1")){
//code for both windows 8.1 and 10
}
Ahora para explicar lo que está pasando aquí:
la instrucción if es solo un condicional para determinar la versión de Windows
System.getProperty("os.name")
devuelve el nombre del sistemaSystem.getProperty("os.name")
como una cadenaEl método
.toLowerCase()
hace que la cadena inferior devuelta en minúsculaEl
.contains(String)
comprueba si la cadena de entrada dada está contenida en la cadena a la que se llama.La última declaración permite un código diferente para cada sistema operativo, excepto 8.1 y 10, que deberían manejarse como un bloque :(