我有一些关于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来说是一个非常糟糕的设计决定。 好在很容易改变。