2010-03-30 15 views
1

J'ai quelques questions sur le registre.
Nous avonsTravailler avec le registre Windows en utilisant java.util.prefs.Preferences

Preferences p = Preferences.userRoot(); 

Si nous exécutons

p.nodeExists("/HKEY_CURRENT_USER/Software/Policies/Microsoft")  

il retourne vrai.
Après:

p = p.node("/HKEY_CURRENT_USER/Software/Policies");  
for(String s : p.childrenNames()){ 
    System.out.println(">" + s); 
} 

On voit qu'il a un enfant: "Windows". Mais

p.nodeExists("/HKEY_CURRENT_USER/Software/Policies/Microsoft/Windows") 

renvoie la valeur false. Pourquoi?

Merci.

MISE À JOUR

Ok. J'ai quelques erreurs. Laissez-moi essayer encore: Pourquoi

p.nodeExists("/HKEY_CURRENT_USER/Software/Policies/Microsoft/Windows") 

retourner false?

+1

Votre troisième exemple de code semble désynchronisé avec les deuxième et quatrième. Peut-être que vous devriez le revoir? – Romain

+0

Système d'exploitation: Win Xp Pro Sp3; JDK: 1.6.0_10 .; Utilisateur - admin. –

Répondre

2

Si vous exécutez les lignes de code indiqués, dans l'ordre indiqué, quand vous arrivez à la ligne

p.nodeExists("/HKEY_CURRENT_USER/Software/Policies/Microsoft/Windows") 

p ne pointe pas plus à la racine de l'utilisateur, mais à «/HKEY_CURRENT_USER/Software/Politiques » .

Btw vous avez une omission probable dans votre troisième exemple de code:

p = p.node("/HKEY_CURRENT_USER/Software/Policies");  

devrait être

p = p.node("/HKEY_CURRENT_USER/Software/Policies/Microsoft");  
+0

Si je comprends bien, quand j'utilise "/" je suis toujours en train de lier depuis root. Mais, cela n'a pas d'importance. En utilisant le code suivant, vous obtiendrez le même résultat. Préférences p = Preferences.userRoot(); p.nodeExists (.../Microsoft/Windows "); - faux p.nodeExists (.../Microsoft")); - vrai –

+0

@Stas Vous avez raison (selon les docs de l'API). Puzzling ... J'ai effectivement essayé de le reproduire sur ma machine mais je ne pouvais même pas aller aussi loin que vous: ne pouvait obtenir un nœud racine totalement vide :-( –

+1

@Stas Je suppose que cela pourrait être en quelque sorte lié aux privilèges .. Quel système d 'exploitation et JDK vous utilisez? –

0

je suis tombé sur celui-ci aujourd'hui. La réponse que vous avez acceptée est complètement fausse.

Vous semblez avoir l'impression que Java Preferences est un outil général pour manipuler le Registre de Windows. Ce n'est pas. Il se trouve que l'implémentation par défaut des préférences sur la plate-forme Windows arrive à stocker ses données dans le registre Windows.

La mise en œuvre sur des choses de Windows stocke sous les chemins de Registre suivants:

Pour systemRoot: HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs

Pour userRoot: HKEY_CURRENT_USER\Software\JavaSoft\Prefs

(note: Les chemins de registre change un peu si vous utilisez un JRE 32 bits sur un système d'exploitation 64 bits, mais cela n'a rien à voir avec Java et tout ce qui concerne Windows.) Le code de Sun utilise toujours les chemins ci-dessus.)

Le point à faire est que vous pouvez peut-être utiliser l'interface Java Preferences pour lire ou modifier des valeurs dans le registre Windows, mais seulement ci-dessous les chemins de registre ci-dessus. La raison pour laquelle je dis 'peut-être' est que c'est exactement ce qui se passe en ce moment.Sun/Oracle peut à tout moment décider de ne pas utiliser le registre Windows ou d'utiliser le registre Windows mais sans utiliser de sous-nœuds, c'est-à-dire stocker tout dans une grande chaîne XML ou quelque chose de ce genre. Le fait est que Java Preferences est conçu pour vous protéger de cela.

Beaucoup de logiciels Java qui utilisent les Préférences Java fournissent leur propre implémentation (ce qui est assez simple à faire) pour éviter l'implémentation par défaut de Sun qui utilise le Registre Windows. Tout le monde ne peut pas écrire sur le registre Windows ces jours-ci, ce qui a été une mauvaise décision de conception de la part de Sun. Heureusement très facile à changer.