2015-08-09 12 views
38

In Java, è possibile visualizzare il valore della proprietà di os.name per conoscere il nome del sistema operativo sottostante: System.getProperty("os.name")."os.name" di Java per Windows 10?

Per ogni edizione di Windows, è utilizzata per restituire sempre il nome esatto del sistema operativo: Windows XP per XP, Windows Vista per Vista, Windows 7 per Seven, Windows 8.1 per 8,1, e così via ...

Il problema è: ho appena aggiornato il mio Windows 8.1 a Windows 10 utilizzando il programma di aggiornamento di Microsoft rilasciato, e sembra che questa proprietà rimane ancora Windows 8.1:

public class OSTest { 
    public static void main(String[] args) { 
    System.out.println(System.getProperty("os.name")); 
    } 
} 

Come si crea una soluzione per questo? E qualcuno sa se questo problema persiste se si installa una nuova copia di Windows 10 - cioè, questo bug è causato dall'aggiornamento automatico di Microsoft -?

+1

Su quale versione di Java si sta eseguendo questa operazione (non che io abbia idea di come risolvere questo problema, a parte forse attendere un aggiornamento o una correzione di Java o Windows)? –

+0

Sto eseguendo JDK 1.8.0_40 – BloodShura

+1

Hai riavviato? Qual è il risultato di ['ver'] (https://en.wikipedia.org/wiki/Ver_%28command%29) sulla riga di comando? –

risposta

35

Questo è un problema noto JDK-8066504 che è stato risolto nel prossimo aggiornamento Java 8 60.

La ragione è GetVersionEx funzione è cambiato il suo comportamento rispetto a Windows 8.1.

Esistono più soluzioni alternative, vedere MSDN article.

Il banale è quello di exec cmd.exe /c ver.

L'altro è quello di esaminare le informazioni sulla versione di uno dei file di sistema, ad es. kernel32.dll.

11

Questo è sicuramente un bug noto. Si verifica perché la proprietà os.name ottiene il suo valore dallo GetVersionEx nel codice sorgente dell'API di Windows. GetVersionEx tuttavia,

può essere modificata o non è disponibile per le versioni di Windows, dopo 8,1

Come per il sito ufficiale di Microsoft. Invece, dovremo utilizzare lo IsWindows10OrGreater trovato nelle funzioni dell'API Versione Helper nel file versionhelpers.h. Come probabilmente avete indovinato, questo file non è un file Java, è scritto in C. Di conseguenza, è necessario includerlo in un modo piuttosto indiretto. Ci vuole un bel po 'di lavoro (devi programmare in JNI: /) ma lo this tutorial ti aiuterà a farlo. Un'altra soluzione è mostrata in this bug log e richiede meno sforzo.

-12

Si potrebbe anche utilizzare il metodo .contains() e basta controllare per le "finestre" stringa forse lungo le linee di

if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains(windows version here [xp, 7, 8, etc]))){} 

Se avete bisogno della versione di Windows si potrebbe verificare per tutte le versioni e quindi assumere 8.1 o 10 per spostarsi attorno al bug.

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 

} 

Ora, per spiegare cosa sta succedendo qui:

  1. l'istruzione if è solo un condizionale per determinare la versione di Windows

  2. Il System.getProperty("os.name") restituisce il nome del sistema operativo, come una stringa

  3. Il metodo .toLowerCase() rende quello restituito String minuscolo

  4. I .contains(String) controlla metodo se la stringa di input proposta è contenuta nella stringa che viene chiamato

  5. L'ultima istruzione permette di codice diverso per ogni os tranne 8.1 & 10 che devono essere trattati come un blocco :(

+3

"L'ultima istruzione consente un codice diverso per ogni sistema operativo tranne 8.1 e 10". Questo è ESATTAMENTE quello che OP NON vuole. Quindi, questa risposta fa letteralmente tutto MA risponda alla domanda. – HyperNeutrino