在Java中,为什么WindowsPreferences对大写字母使用斜杠?

我一直在使用java.util.prefs.Preferencesfunction(在Java 8中,在Windows机器上)。 它的工作原理,我可以在Windowsregistry中写入新的密钥。 因此,我使用Preferences.systemRoot()获取系统的Preferences对象,然后使用node()方法获取映射到Windowsregistry中节点的Preferences对象。 它创造的事情很好。

我用于Node的密钥是所有大写字母(“RBI”)的string。 当我查看Windowsregistry中的节点时,它显示为“/ R / B / I”,名称中带有正斜杠。

我觉得这很奇怪,所以我挖了一下,看起来这是故意的。 我发现在Windows环境(java.util.prefs.WindowsPreferences)中提供了Preferences的实现,并且该方法用于构build发送到Windowsregistry的值,这是一个静态方法,用于WindowsName。 在JavaDoc的那….

/** * Converts value's or node's name to its Windows representation * as a byte-encoded string. * Two encodings, simple and altBase64 are used. * <p> * <i>Simple</i> encoding is used, if java string does not contain * any characters less, than 0x0020, or greater, than 0x007f. * Simple encoding adds "/" character to capital letters, ie * "A" is encoded as "/A". Character '\' is encoded as '//', * '/' is encoded as '\'. * The constructed string is converted to byte array by truncating the * highest byte and adding the terminating <tt>null</tt> character. * <p> * <i>altBase64</i> encoding is used, if java string does contain at least * one character less, than 0x0020, or greater, than 0x007f. * This encoding is marked by setting first two bytes of the * Windows string to '/!'. The java name is then encoded using * byteArrayToAltBase64() method from * Base64 class. */ 

因此,简单编码将会为大写字母添加正斜杠。

有谁知道为什么这是必需的? 我以为注册局可以处理区分大小写的值,但这似乎表明它不能?

我可以解决这个问题,我只是好奇为什么这样做。

Solutions Collecting From Web of "在Java中,为什么WindowsPreferences对大写字母使用斜杠?"

我很好奇,因为我发现了以下解释:

注册表键是保留大小写的,但不区分大小写。 例如,如果你有一个密钥“Rbi”,你不能再做一个名为“RBi”的密钥。 案件被保存,但被忽略。 Sun的案例敏感解决方案是在关键字上添加斜杠。

注册表值是区分大小写的(当然,还有保留大小写)。 我不认为Sun也打算在这些值上添加斜线,但是不知何故,这个斜杠就是隐藏在代码中的。 在我看来,这个错误很久没有找到。 当发现错误时,许多系统已经依赖于错误的实现,所以它们从不删除它以保持兼容性。

如果您不喜欢Registry-Values中的斜杠,则可能对此实现感兴趣。