使用java.util.prefs.Preferences处理Windowsregistry

我有一些关于registry的问题。
我们有

Preferences p = Preferences.userRoot(); 

如果我们执行

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

它会返回true。
之后:

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

我们看到它有一个孩子:“Windows”。 但

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

返回false。 为什么?

谢谢。

UPDATE

好。 我有一些错误。 让我再试一次:为什么呢

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

返回false?

如果您执行显示的代码行,按照所示的顺序,当您到达该行时

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

p不再指向用户root,而是指向“/ HKEY_CURRENT_USER / Software / Policies”。

顺便说一句,你有一个可能的遗漏在你的第三个代码示例:

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

应该

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

今天我偶然发现了这个 你接受的答案是完全错误的。

您似乎认为Java Preferences是操作Windows注册表的一般工具。 不是这样。 恰恰恰巧,Windows平台上的首选项的默认实现正好将其数据存储在Windows注册表中。

在Windows上的实现存储在以下注册表路径下的东西:

对于systemRoot: HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs

对于userRoot: HKEY_CURRENT_USER\Software\JavaSoft\Prefs

(注意:如果您在64位操作系统上使用32位JRE,那么注册表路径会发生一些变化,但与Java无关并且与Windows无关,Sun的代码始终使用上述路径。

要做的一点是,您可以使用Java Preferences界面来读取或更改Windows注册表中的值,但只能在上面的注册表路径下面 我之所以说'也许'是因为这是目前的情况。 Sun / Oracle可能会在任何时候决定不使用Windows注册表或使用Windows注册表,但不使用子节点,即将所有内容存储在一个大的XML字符串中。 重点是Java首选项旨在保护你免受这种情况。

许多使用Java首选项的Java软件都提供了自己的实现(这非常简单),以避免Sun使用Windows注册表的默认实现。 不是每个人都可以写入Windows注册表,所以这对Sun来说是一个非常糟糕的设计决定。 好在很容易改变。