В Java, почему WindowsPreferences использует слэши для заглавных букв?

Я работал с java.util.prefs.Preferences функциональностью (в Java 8, на машине Windows). И он работает, где я могу писать новые ключи в реестр Windows. Поэтому я использую Preferences.systemRoot(), чтобы получить объект Preferences для системы, а затем использовать метод node(), чтобы получить объект Preferences, который сопоставляется с node в реестре Windows. И это прекрасно создает вещи.

Ключ, который я использую для node, является строкой всех заглавных букв ( "RBI" ). Когда я смотрю на node в реестре Windows, он появляется как "/R/B/I", с косой чертой в имени.

Я думал, что это странно, поэтому я немного вырыл. И похоже, что это намеренно. Я нашел класс, который обеспечивает реализацию Preferences в среде Windows (java.util.prefs.WindowsPreferences), и этот метод используется для создания значений, отправленных в реестр Windows, является статическим методом для WindowsName. В JavaDoc для этого....

/**
 * Converts value or node 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.
 */

Таким образом, простая кодировка будет содержать заглавные буквы, добавить косую черту.

Кто-нибудь знает, почему это требуется? Я думал, что реестр может обрабатывать чувствительные к регистру значения, но это, похоже, указывает на то, что он не может?

Я могу обойти это, мне просто интересно, почему это было сделано.

Ответ 1

Мне было любопытно, как вы и я нашли следующее объяснение:

Ключи реестра сохраняются в любом случае, но не учитываются в регистре. Например, если у вас есть ключ "Rbi", вы не можете сделать другой ключ с именем "RBi". Случай сохраняется, но игнорируется. Решение Sun для чувствительности к регистру заключалось в добавлении косых черт к ключу.

Значения реестра чувствительны к регистру (и, конечно, сохраняют регистр). Я не думаю, что было намерение Солнца также добавить косые черты к значениям, но каким-то образом он проскользнул в код. Мне кажется, что эта ошибка не была найдена в течение длительного времени. Когда ошибка была обнаружена, многие системы уже зависели от неправильной реализации, поэтому они никогда не удаляли ее, чтобы сохранить совместимость.

Если вам не нравятся косые черты в значениях реестра, вы можете быть заинтересованы в этой реализации.