2014-04-10 15 views
10

Ho lavorato con la funzionalità java.util.prefs.Preferences (in Java 8, su un computer Windows). E funziona, dove posso scrivere nuove chiavi nel registro di Windows. Quindi, utilizzo Preferences.systemRoot() per ottenere l'oggetto Preferences per il sistema e quindi utilizzare il metodo node() per ottenere un oggetto Preferences che si associa a un nodo nel registro di Windows. E sta creando le cose bene.In Java, perché WindowsPreferences utilizza le barre per lettere maiuscole?

La chiave che sto usando per il nodo è una stringa in tutte le lettere maiuscole ("RBI"). Quando guardo il nodo nel registro di Windows, viene visualizzato come "/ R/B/I", con barre in avanti nel nome.

Ho pensato che fosse strano, quindi ho scavato un po 'e sembra che sia intenzionale. Ho trovato la classe che fornisce l'implementazione di Preferenze su un ambiente Windows (java.util.prefs.WindowsPreferences) e il metodo è utilizzabile per costruire i valori inviati al registro di Windows è un metodo statico per NomeWindows. Nel JavaDoc per questo ....

/** 
* Converts value's or node's name to its Windows representation 
* as a byte-encoded string. 
* Two encodings, simple and altBase64 are used. 
* <p> 
* <i>Simple</i> encoding is used, if java string does not contain 
* any characters less, than 0x0020, or greater, than 0x007f. 
* Simple encoding adds "/" character to capital letters, i.e. 
* "A" is encoded as "/A". Character '\' is encoded as '//', 
* '/' is encoded as '\'. 
* The constructed string is converted to byte array by truncating the 
* highest byte and adding the terminating <tt>null</tt> character. 
* <p> 
* <i>altBase64</i> encoding is used, if java string does contain at least 
* one character less, than 0x0020, or greater, than 0x007f. 
* This encoding is marked by setting first two bytes of the 
* Windows string to '/!'. The java name is then encoded using 
* byteArrayToAltBase64() method from 
* Base64 class. 
*/ 

Così, la codifica semplice sarà, per le lettere maiuscole, aggiungere una barra.

Qualcuno sa perché è necessario? Avevo pensato che il registro potesse gestire i valori sensibili al maiuscolo/minuscolo, ma questo sembra indicare che non può?

Posso aggirare questo, sono solo curioso di sapere perché è stato fatto.

+0

Sembra che stiano cercando di rendere lo schema di denominazione case-sensitive. –

+0

D'accordo, ma usando RegEdit posso inserire stringhe sensibili al caso (ce ne sono già molte). E usando altri strumenti quell'opzione era lì. Forse è una soluzione alternativa con le chiamate ai metodi nativi in ​​definitiva utilizzati. – EdH

+0

Sembra che stia codificando la stringa come una matrice di byte. Che va bene Ora, l'unica ragione per cui posso pensare (quelle ultime quattro parole chiave) di farlo sarebbe se non avessi valori byte diversi per lettere maiuscole e minuscole. Ma, ancora una volta, per quanto ne so, le lettere minuscole e maiuscole hanno valori di byte diversi. Quindi, non è davvero necessario? Devo mancare qualcosa – EdH

risposta

11

ero curioso come voi e ho trovato la seguente spiegazione:

Registry-Keys sono-preservare caso, ma maiuscole e minuscole. Ad esempio se hai una chiave "Rbi" non puoi creare un'altra chiave chiamata "RBi". Il caso viene salvato ma ignorato. La soluzione di Sun per la sensibilità al maiuscolo/minuscolo consisteva nell'aggiungere barre sulla chiave.

Registro di sistema: i valori sono sensibili al maiuscolo/minuscolo (e, ovviamente, alla conservazione del caso). Non penso che l'intenzione di Sun fosse di aggiungere le barre ai valori, ma in qualche modo è scivolata nel codice. Mi sembra che questo errore non sia stato trovato per molto tempo. Quando il bug è stato scoperto, molti sistemi dipendevano già dall'implementazione sbagliata, quindi non l'hanno mai rimosso per mantenere la compatibilità.

Se non vi piacciono le barre nei vostri valori di registro, potreste essere interessati a this implementation.

Problemi correlati