1

レジストリについていくつか質問があります。
我々は持っています

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」という子が1つあることがわかります。だが

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

falseを返します。なんで?

ありがとう。

アップデート

Ok。間違いがあります。もう一度試してみましょう:なぜですか

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

falseを返しますか?

4

2 に答える 2

3

示されているコード行を、示されている順序で実行すると、その行に到達したときに

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

pユーザーrootではなく、「/ HKEY_CURRENT_USER / Software/Policies」を指します。

ところで、3番目のコードサンプルにはおそらく欠落があります。

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設定がWindowsレジストリを操作するための一般的なツールであるという印象を受けているようです。そうではない。たまたま、WindowsプラットフォームでのPreferencesのデフォルトの実装は、そのデータをWindowsレジストリに保存します。

Windowsでの実装では、次のレジストリパスにデータが保存されます。

systemRootの場合:HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs

userRootの場合:HKEY_CURRENT_USER\Software\JavaSoft\Prefs

(注:64ビットOSで32ビットJREを使用している場合、レジストリパスは少し変わりますが、JavaやWindowsとは関係ありません。Sunのコードは常に上記のパスを使用します。)

重要なのは、Java設定インターフェイスを使用して、Windowsレジストリの値を読み取ったり変更したりできますが、上記のレジストリパスの下にある場合のみです。私が「たぶん」と言う理由は、これがまさに現時点での状況だからです。Sun / Oracleは、いつでもWindowsレジストリを使用しないか、Windowsレジストリを使用するが、サブノードを使用しないことを決定できます。つまり、すべてを1つの大きなXML文字列などに格納します。重要なのは、Java設定はこれからあなたを保護するように設計されているということです。

Javaプリファレンスを使用する多くのJavaソフトウェアは、Windowsレジストリを使用するSunのデフォルトの実装を回避するために、独自の実装を提供します(これは非常に簡単です)。最近、誰もがWindowsレジストリに書き込むことができるわけではないので、Sunの側ではかなり悪い設計上の決定でした。幸い、変更は非常に簡単です。

于 2015-09-19T16:01:35.920 に答える