2014-04-10 7 views
10

मैं java.util.prefs के साथ काम कर रहा हूं। संदर्भ कार्यक्षमता (जावा 8 में, विंडोज मशीन पर)। और यह काम करता है, जहां मैं विंडोज रजिस्ट्री में नई चाबियाँ लिख सकता हूं। इसलिए, मैं सिस्टम के लिए प्राथमिकता ऑब्जेक्ट प्राप्त करने के लिए Preferences.systemRoot() का उपयोग करता हूं, और उसके बाद प्राथमिकता ऑब्जेक्ट प्राप्त करने के लिए नोड() विधि का उपयोग करता हूं जो Windows रजिस्ट्री में किसी नोड को मैप करता है। और यह चीजों को ठीक बना रहा है।जावा में, WindowsPreferences कैपिटल अक्षरों के लिए स्लेश का उपयोग क्यों करता है?

कुंजी जो मैं नोड के लिए उपयोग कर रहा हूं वह सभी पूंजी अक्षरों ("आरबीआई") में एक स्ट्रिंग है। जब मैं विंडोज रजिस्ट्री में नोड को देखता हूं, तो यह नाम में आगे की धड़कन के साथ "/ आर/बी/आई" के रूप में आता है।

मैंने सोचा कि यह अजीब था, इसलिए मैंने थोड़ा सा खोला है और ऐसा लगता है कि यह जानबूझकर है। मुझे वह कक्षा मिली जो विंडोज वातावरण (java.util.prefs.WindowsPreferences) पर प्राथमिकताओं के कार्यान्वयन को प्रदान करती है और विंडोज रजिस्ट्री को भेजे गए मानों के निर्माण के लिए विधि का उपयोग विन्डोज़नाम के लिए एक स्थिर विधि है। उस के लिए 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, 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. 
*/ 

तो, सरल एन्कोडिंग, बड़े अक्षरों के लिए, एक फ़ॉर्वर्ड स्लैश जोड़ देगा।

क्या किसी को पता है कि इसकी आवश्यकता क्यों है? मैंने सोचा था कि रजिस्ट्री केस-संवेदी मूल्यों को संभाल सकती है, लेकिन ऐसा लगता है कि यह नहीं कर सकता है?

मैं इसके आसपास काम कर सकता हूं, मैं उत्सुक हूं कि यह क्यों किया गया।

+0

लगता है जैसे वे नामकरण योजना केस-संवेदी बनाने की कोशिश कर रहे हैं। –

+0

सहमत हैं, लेकिन RegEdit का उपयोग करके मैं केस संवेदनशील स्ट्रिंग्स दर्ज कर सकता हूं (उनमें से बहुत सारे पहले से ही हैं)। और अन्य उपकरण का उपयोग करना जो विकल्प था। शायद यह आखिरकार उपयोग किए जाने वाले मूल तरीकों में कॉल के साथ कुछ कामकाज है। – EdH

+0

ऐसा लगता है कि यह स्ट्रिंग को बाइट सरणी के रूप में एन्कोड कर रहा है। जो ठीक है अब, ऐसा करने का एकमात्र कारण मैं (उन अंतिम चार शब्दों को प्रमुख) के बारे में सोच सकता हूं, यदि आपके पास निचले और ऊपरी केस अक्षरों के लिए अलग-अलग बाइट मान नहीं हैं। लेकिन, फिर से, जहां तक ​​मुझे पता है, लोअरकेस और अपरकेस अक्षरों में अलग बाइट मान हैं। तो, यह वास्तव में जरूरी नहीं है? मुझे कुछ – EdH

उत्तर

11

मैं आप के रूप में उत्सुक था और मैं निम्नलिखित विवरण पाया:

रजिस्ट्री-कुंजी केस-संरक्षण, लेकिन केस-संवेदी है। उदाहरण के लिए यदि आपके पास "आरबीआई" कुंजी है तो आप "आरबीआई" नामक एक और कुंजी नहीं बना सकते हैं। मामला बचाया गया है लेकिन अनदेखा किया गया है। केस-सेंसिटीविटी के लिए सूर्य का समाधान कुंजी पर स्लैश जोड़ना था।

रजिस्ट्री-मान केस-संवेदी (और, ज़ाहिर है, केस-संरक्षित) हैं। मुझे नहीं लगता कि सूर्य के इरादे भी कीमतों में स्लैश जोड़ने का इरादा था, लेकिन किसी भी तरह यह कोड में फिसल गया। मुझे लगता है कि यह बग लंबे समय तक नहीं मिला था। जब बग की खोज की गई, तो कई प्रणालियां पहले से ही गलत कार्यान्वयन पर निर्भर थीं, इसलिए उन्होंने इसे संगतता बरकरार रखने के लिए कभी नहीं हटा दिया।

यदि आपको अपने रजिस्ट्री-मूल्यों में स्लैश पसंद नहीं हैं, तो आपको this implementation में रुचि हो सकती है।

संबंधित मुद्दे

 संबंधित मुद्दे