Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,为什么WindowsPreferences对大写字母使用斜杠?_Java_Windows_Registry - Fatal编程技术网

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

在Java中,为什么WindowsPreferences对大写字母使用斜杠?,java,windows,registry,Java,Windows,Registry,我一直在使用java.util.prefs.Preferences功能(在java 8中,在Windows机器上)。它可以工作,在那里我可以将新的键写入Windows注册表。因此,我使用Preferences.systemRoot()获取系统的Preferences对象,然后使用node()方法获取映射到Windows注册表中节点的Preferences对象。它正在创造美好的事物 我用于节点的键是一个全大写的字符串(“RBI”)。当我查看Windows注册表中的节点时,它显示为“/R/B/I”,

我一直在使用java.util.prefs.Preferences功能(在java 8中,在Windows机器上)。它可以工作,在那里我可以将新的键写入Windows注册表。因此,我使用Preferences.systemRoot()获取系统的Preferences对象,然后使用node()方法获取映射到Windows注册表中节点的Preferences对象。它正在创造美好的事物

我用于节点的键是一个全大写的字符串(“RBI”)。当我查看Windows注册表中的节点时,它显示为“/R/B/I”,名称中带有正斜杠

我觉得这很奇怪,所以我在附近挖了一点,看起来这是故意的。我发现在Windows环境(java.util.prefs.WindowsPreferences)上提供首选项实现的类,用于构建发送到Windows注册表的值的方法是一个静态方法toWindowsName。在JavaDoc中

/**
*将值或节点的名称转换为其Windows表示形式
*作为字节编码的字符串。
*使用了两种编码,simple和altBase64。
*
*如果java字符串不包含
*小于、小于0x0020或大于0x007f的任何字符。
*简单编码将“/”字符添加到大写字母中,即。
*“A”编码为“/A”。字符“\”编码为“/”,
*“/”编码为“\”。
*构造的字符串通过截断
*最高字节并添加终止的空字符。
*
*如果java字符串确实包含至少个字符,则使用altBase64编码
*小于0x0020或大于0x007f的一个字符。
*此编码通过设置
*Windows字符串到“/!”。然后使用
*来自的byteArrayToAltBase64()方法
*Base64类。
*/
因此,对于大写字母,简单的编码将添加一个正斜杠

有人知道为什么需要这样做吗?我原以为注册表可以处理区分大小写的值,但这似乎表明它不能


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

我和你一样好奇,我发现了以下解释:

注册表项保留大小写,但不区分大小写。例如,如果您有一个“Rbi”键,则无法生成另一个名为“Rbi”的键。案例已保存,但被忽略。Sun针对区分大小写的解决方案是在键上添加斜杠

注册表值区分大小写(当然,还保留大小写)。我不认为Sun也打算在值中添加斜杠,但不知怎的,它滑入了代码中。在我看来,这个bug很久没有被发现了。当缺陷被发现时,许多系统已经依赖于错误的实现,因此他们从未删除它以保持兼容性


如果您不喜欢注册表值中的斜杠,您可能会对它感兴趣。

听起来好像他们试图使命名方案区分大小写。同意,但使用RegEdit我可以输入区分大小写的字符串(其中已经有很多了)。并使用其他工具,这是一种选择。也许这是对最终使用的本机方法的调用的一些变通方法。它看起来像是将字符串编码为字节数组。这很好。现在,我能想到这样做的唯一原因(最后四个字是关键的)是如果你没有不同的大小写字母的字节值。但是,再一次,据我所知,小写和大写字母确实有不同的字节值。那么,这真的没有必要吗?我一定遗漏了什么不,注册表中的名称是保留大小写的,但不区分大小写。不能在同一个键中有名为“Fred”的值和名为“Fred”的值。有趣。我不知道。
/**
 * 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, i.e.
 * "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.
 */