मैं =
जावा संपत्ति फ़ाइलों में बराबर चिह्न ( ) से कैसे बच सकता हूं ? मैं अपनी फ़ाइल में निम्नलिखित के रूप में कुछ डालना चाहूंगा:
table.whereclause=where id=100
जवाबों:
इसके अलावा, कृपया javadoc पर कक्षा से लोड (रीडर रीडर) विधि देखेंProperty
में load(Reader reader)
विधि प्रलेखन यह कहता है
कुंजी लाइन पहली गैर सफेद स्थान चरित्र के साथ और करने के लिए शुरू में पात्रों के सभी शामिल है, लेकिन सहित नहीं, पहले नहीं छोड़ा जाएगा
'='
,':'
या व्हाइट स्पेस एक लाइन टर्मिनेटर के अलावा अन्य चरित्र। इन सभी प्रमुख समाप्ति वर्णों को कुंजी में शामिल किया जा सकता है, जिससे वे पूर्ववर्ती बैकलैश चरित्र के साथ बच जाते हैं; उदाहरण के लिए,\:\=
हो सकता है दो-चरित्र कुंजी
":=".
लाइन टर्मिनेटर वर्णों का उपयोग करके\r
और\n
अनुक्रमों से बचने के लिए शामिल किया जा सकता है । कुंजी के छोड़े जाने के बाद कोई भी सफेद स्थान; यदि कुंजी के बाद पहला गैर-श्वेत स्थान वर्ण है'='
या':'
, तो इसे अनदेखा कर दिया जाता है और इसके बाद किसी भी श्वेत स्थान वर्ण को भी छोड़ दिया जाता है। लाइन पर शेष सभी पात्र संबद्ध तत्व स्ट्रिंग का हिस्सा बन जाते हैं; यदि शेष वर्ण नहीं हैं, तो तत्व रिक्त स्ट्रिंग है""
। एक बार जब मुख्य और तत्व की पहचान करने वाले कच्चे वर्ण अनुक्रम की पहचान की जाती है, तो बचना प्रसंस्करण ऊपर वर्णित है।
उम्मीद है की वो मदद करदे।
अपने विशिष्ट उदाहरण में आपको बराबरी से बचने की आवश्यकता नहीं है - यदि आपको कुंजी का हिस्सा है तो आपको इसे बचने की आवश्यकता है। गुण फ़ाइल स्वरूप सभी वर्णों को मान के भाग के रूप में पहली अनस्कैप्ड समान के बाद व्यवहार करेगा।
जावा में डिफ़ॉल्ट बच चरित्र '\' है।
हालांकि, जावा प्रॉपर्टीज़ फ़ाइल में प्रारूप कुंजी = मान है, यह मान के रूप में पहले बराबर के बाद सब कुछ पर विचार करना चाहिए।
इस तरह के मुद्दों से बचने का सबसे अच्छा तरीका यह है कि वे प्रोग्रामेटिक रूप से गुणों का निर्माण करें और फिर उन्हें स्टोर करें। उदाहरण के लिए, इस तरह कोड का उपयोग करना:
java.util.Properties props = new java.util.Properties();
props.setProperty("table.whereclause", "where id=100");
props.store(System.out, null);
यह ठीक से बच गए संस्करण System.out को आउटपुट देगा।
मेरे मामले में आउटपुट था:
#Mon Aug 12 13:50:56 EEST 2013
table.whereclause=where id\=100
जैसा कि आप देख सकते हैं, यह .properties फ़ाइलों की सामग्री को उत्पन्न करने का एक आसान तरीका है जो सही होने की गारंटी है। और आप जितने चाहें उतने गुण रख सकते हैं।
मेरे मामले में, दो प्रमुख '\\' मेरे लिए ठीक काम कर रहे हैं।
उदाहरण के लिए: यदि आपके शब्द में '#' वर्ण है (जैसे कि # # 100, तो आप इसे दो प्रमुख '\\' से बचा सकते हैं
key= aa\\#100
आप यहां देख सकते हैं कि क्या जावा संपत्ति में कुंजी एक खाली चरित्र शामिल हो सकती है?
भागने के लिए बराबर '=' \ u003d
table.whereclause = जहाँ id = 100
कुंजी: [table.whereclause] मूल्य: [जहां आईडी = 100]
table.whereclause \ u003dwhere id = 100
कुंजी: [table.whereclause = जहाँ] मूल्य: [आईडी = १००]
table.whereclause \ u003dwhere \ u0020id \ u003d100
कुंजी: [table.whereclause = जहाँ id = 100] मान: []
इस पद्धति को प्रोग्रामेटिक रूप से .properties
फाइलों के साथ 100% संगत होने के लिए आवश्यक मान उत्पन्न करने में मदद करनी चाहिए :
public static String escapePropertyValue(final String value) {
if (value == null) {
return null;
}
try (final StringWriter writer = new StringWriter()) {
final Properties properties = new Properties();
properties.put("escaped", value);
properties.store(writer, null);
writer.flush();
final String stringifiedProperties = writer.toString();
final Pattern pattern = Pattern.compile("(.*?)escaped=(.*?)" + Pattern.quote(System.lineSeparator()) + "*");
final Matcher matcher = pattern.matcher(stringifiedProperties);
if (matcher.find() && matcher.groupCount() <= 2) {
return matcher.group(matcher.groupCount());
}
// This should never happen unless the internal implementation of Properties::store changed
throw new IllegalStateException("Could not escape property value");
} catch (final IOException ex) {
// This should never happen. IOException is only because the interface demands it
throw new IllegalStateException("Could not escape property value", ex);
}
}
आप इसे इस तरह कह सकते हैं:
final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"
यह तरीका थोड़ा महंगा है लेकिन, फ़ाइल में गुण लिखना आमतौर पर वैसे भी एक छिटपुट कार्रवाई है।
मैं चरित्र के भीतर मान इनपुट करने में सक्षम हूं ":
db_user="postgresql"
db_passwd="this,is,my,password"