कैसे संपत्तियों फ़ाइलों में बराबर चिह्न से बचने के लिए


84

मैं =जावा संपत्ति फ़ाइलों में बराबर चिह्न ( ) से कैसे बच सकता हूं ? मैं अपनी फ़ाइल में निम्नलिखित के रूप में कुछ डालना चाहूंगा:

table.whereclause=where id=100

जवाबों:


83

इसके अलावा, कृपया javadoc पर कक्षा से लोड (रीडर रीडर) विधि देखेंProperty

में load(Reader reader)विधि प्रलेखन यह कहता है

कुंजी लाइन पहली गैर सफेद स्थान चरित्र के साथ और करने के लिए शुरू में पात्रों के सभी शामिल है, लेकिन सहित नहीं, पहले नहीं छोड़ा जाएगा '=', ':'या व्हाइट स्पेस एक लाइन टर्मिनेटर के अलावा अन्य चरित्र। इन सभी प्रमुख समाप्ति वर्णों को कुंजी में शामिल किया जा सकता है, जिससे वे पूर्ववर्ती बैकलैश चरित्र के साथ बच जाते हैं; उदाहरण के लिए,

\:\=

हो सकता है दो-चरित्र कुंजी ":=". लाइन टर्मिनेटर वर्णों का उपयोग करके \rऔर \nअनुक्रमों से बचने के लिए शामिल किया जा सकता है । कुंजी के छोड़े जाने के बाद कोई भी सफेद स्थान; यदि कुंजी के बाद पहला गैर-श्वेत स्थान वर्ण है '=' या ':', तो इसे अनदेखा कर दिया जाता है और इसके बाद किसी भी श्वेत स्थान वर्ण को भी छोड़ दिया जाता है। लाइन पर शेष सभी पात्र संबद्ध तत्व स्ट्रिंग का हिस्सा बन जाते हैं; यदि शेष वर्ण नहीं हैं, तो तत्व रिक्त स्ट्रिंग है ""। एक बार जब मुख्य और तत्व की पहचान करने वाले कच्चे वर्ण अनुक्रम की पहचान की जाती है, तो बचना प्रसंस्करण ऊपर वर्णित है।

उम्मीद है की वो मदद करदे।


89

अपने विशिष्ट उदाहरण में आपको बराबरी से बचने की आवश्यकता नहीं है - यदि आपको कुंजी का हिस्सा है तो आपको इसे बचने की आवश्यकता है। गुण फ़ाइल स्वरूप सभी वर्णों को मान के भाग के रूप में पहली अनस्कैप्ड समान के बाद व्यवहार करेगा।


12
पता नहीं क्यों यह चिह्नित नहीं किया गया है! सरलतम सही उत्तर! और ज्यादातर बार लोग गुण फ़ाइल में बचने के लिए देख रहे हैं!
तेजस

1
छोटा सुधार: पहले अनुपलब्ध समान और अनुगामी रिक्त स्थान के बाद सभी वर्णों को मान के रूप में माना जाएगा, अर्थात मूल्य में अग्रणी स्थान निकाल लिए जाते हैं। उदाहरण "myKey = मेरा मान" "myKey = my value" के समान है।
पाउलो मर्सन

23

जावा में डिफ़ॉल्ट बच चरित्र '\' है।
हालांकि, जावा प्रॉपर्टीज़ फ़ाइल में प्रारूप कुंजी = मान है, यह मान के रूप में पहले बराबर के बाद सब कुछ पर विचार करना चाहिए।


7
प्रमुख व्हाट्सएप (ओह और '=' को छोड़कर कुंजी और मान के बीच की आवश्यकता नहीं है, यह हो सकता है: या रिक्त स्थान)
ब्रैड कपिट

16

इस तरह के मुद्दों से बचने का सबसे अच्छा तरीका यह है कि वे प्रोग्रामेटिक रूप से गुणों का निर्माण करें और फिर उन्हें स्टोर करें। उदाहरण के लिए, इस तरह कोड का उपयोग करना:

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 फ़ाइलों की सामग्री को उत्पन्न करने का एक आसान तरीका है जो सही होने की गारंटी है। और आप जितने चाहें उतने गुण रख सकते हैं।


6

मेरे मामले में, दो प्रमुख '\\' मेरे लिए ठीक काम कर रहे हैं।

उदाहरण के लिए: यदि आपके शब्द में '#' वर्ण है (जैसे कि # # 100, तो आप इसे दो प्रमुख '\\' से बचा सकते हैं

   key= aa\\#100


मैं दूसरा, आपको दो बैकस्लैश चाहिए (
ग्लासफिश

2

आप यहां देख सकते हैं कि क्या जावा संपत्ति में कुंजी एक खाली चरित्र शामिल हो सकती है?

भागने के लिए बराबर '=' \ u003d

table.whereclause = जहाँ id = 100

कुंजी: [table.whereclause] मूल्य: [जहां आईडी = 100]

table.whereclause \ u003dwhere id = 100

कुंजी: [table.whereclause = जहाँ] मूल्य: [आईडी = १००]

table.whereclause \ u003dwhere \ u0020id \ u003d100

कुंजी: [table.whereclause = जहाँ id = 100] मान: []


2

स्प्रिंग या स्प्रिंग बूट एप्लिकेशन में। विशेष फ़ाइल यहां वर्णों से बचने का तरीका है;

table.whereclause = जहाँ id '\ _' 100


0

इस पद्धति को प्रोग्रामेटिक रूप से .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"

यह तरीका थोड़ा महंगा है लेकिन, फ़ाइल में गुण लिखना आमतौर पर वैसे भी एक छिटपुट कार्रवाई है।


-1

मैं चरित्र के भीतर मान इनपुट करने में सक्षम हूं ":

db_user="postgresql"
db_passwd="this,is,my,password"

क्यों डाउनवोटिंग? इसका वास्तविक उत्तर है :)
russellhoff

Op का कहना है कि जावा प्रॉपर्टीज, कोट्स जैसे जावा प्रॉपर्टीज फाइलों में काम नहीं करते हैं।
टेकनोपुल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.