1

我有一些关于注册表的问题。
我们有

Preferences p = Preferences.userRoot();

如果我们执行

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

它会返回真。
之后:

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")

返回假。为什么?

谢谢。

更新

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

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

返回假?

4

2 回答 2

3

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

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

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

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

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

应该

p = p.node("/HKEY_CURRENT_USER/Software/Policies/Microsoft");    
于 2010-03-30T20:08:29.233 回答
1

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

您似乎认为Java Preferences是操纵 Windows 注册表的通用工具。它不是。碰巧的是,Windows 平台上 Preferences 的默认实现恰好将其数据存储在 Windows 注册表中。

Windows 上的实现将内容存储在以下注册表路径下:

对于系统根: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 Preferences 旨在保护您免受此影响。

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

于 2015-09-19T16:01:35.920 回答