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