सही तरीके से एक संपत्ति फ़ाइल संपादक (या उनके पसंदीदा पाठ संपादक के लिए एक प्लगइन) जो उन्हें पाठ के रूप में शुद्ध पाठ दर्ज की अनुमति देता है के साथ अपने उपयोगकर्ताओं को प्रदान किया जाएगा , और फ़ाइल फ़ाइल प्रॉपर्टी फ़ाइल में सहेज लेगा।
यदि आप यह नहीं चाहते हैं, तो आप संपत्ति फ़ाइलों के समान सामग्री मॉडल के प्रभावी रूप से (या उप-समूह) सामग्री प्रारूप को परिभाषित कर रहे हैं।
पूरी तरह से जाओ और वास्तव में अपने प्रारूप निर्दिष्ट करें और फिर एक तरह से या तो
- विहित एक करने के लिए प्रारूप को बदलने के लिए के बारे में सोचते हैं, और फिर फ़ाइलों लोड करने के लिए इस का उपयोग करें, या
- इस प्रारूप को पार्स करें और इससे
Properties
ऑब्जेक्ट पॉप्युलेट करें।
ये दोनों दृष्टिकोण केवल तभी काम करेंगे यदि आप वास्तव में अपनी संपत्ति वस्तु के निर्माण को नियंत्रित कर सकते हैं, अन्यथा आपको अपने आवेदन के साथ रूपांतरित प्रारूप को स्टोर करना होगा।
तो, देखते हैं कि हम इसे कैसे परिभाषित कर सकते हैं। सामान्य संपत्ति फ़ाइलों की सामग्री मॉडल सरल है:
- एक स्ट्रिंग मूल्यों, दोनों की अनुमति के मनमाने ढंग से जावा तार करने के लिए स्ट्रिंग चाबियों का नक्शा।
जिस भागने से आप बचाना चाहते हैं, वह केवल मनमाने ढंग से जावा स्ट्रिंग्स की अनुमति देता है, न केवल इन सबसेट का।
में अक्सर पर्याप्त सबसेट होगा:
- स्ट्रिंग कुंजी स्ट्रिंग मूल्यों के लिए (किसी भी प्रमुख युक्त या सफेद स्थान या पंक्ति विराम अनुगामी नहीं) (कोई श्वेत रिक्ति,
:
या =
युक्त नहीं) का एक नक्शा।
अपने उदाहरण dir = c:\mydir
में, कुंजी dir
और मूल्य c:\mydir
होगा।
यदि हम चाहते हैं कि हमारी चाबियाँ और मानों में कोई यूनिकोड वर्ण (उल्लिखित वर्जित लोगों के अलावा) शामिल है, तो हमें स्टोरेज एन्कोडिंग के रूप में यूटीएफ -8 (या यूटीएफ -16) का उपयोग करना चाहिए - क्योंकि हमारे पास वर्णों से बचने का कोई तरीका नहीं है भंडारण एन्कोडिंग के बाहर। अन्यथा, यूएस-एएससीआईआईआई या आईएसओ -885 9 -1 (सामान्य संपत्ति फाइलों के रूप में) या जावा द्वारा समर्थित किसी अन्य एन्कोडिंग पर्याप्त होगा, लेकिन सामग्री मॉडल के अपने विनिर्देशन में इसे शामिल करना सुनिश्चित करें (और इसे इस तरह से पढ़ना सुनिश्चित करें)।
के बाद से हम अपनी सामग्री मॉडल प्रतिबंधित ताकि सभी "खतरनाक" वर्ण रास्ते से हट रहे, अब हम फ़ाइल स्वरूप बस इस के रूप में परिभाषित कर सकते हैं: अब या तो कुंजी या मान में होने वाली
<simplepropertyfile> ::= (<line> <line break>)*
<line> ::= <comment> | <empty> | <key-value>
<comment> ::= <space>* "#" < any text excluding line breaks >
<key-value> ::= <space>* <key> <space>* "=" <space>* <value> <space>*
<empty> ::= <space>*
<key> ::= < any text excluding ':', '=' and whitespace >
<value> ::= < any text starting and ending not with whitespace,
not including line breaks >
<space> ::= < any whitespace, but not a line break >
<line break> ::= < one of "\n", "\r", and "\r\n" >
हर \
वास्तविक बैकस्लैश है, कुछ भी नहीं जो कुछ और से बचता है।
public DoubleBackslashFilter extends FilterReader {
private boolean bufferedBackslash = false;
public DoubleBackslashFilter(Reader org) {
super(org);
}
public int read() {
if(bufferedBackslash) {
bufferedBackslash = false;
return '\\';
}
int c = super.read();
if(c == '\\')
bufferedBackslash = true;
return c;
}
public int read(char[] buf, int off, int len) {
int read = 0;
if(bufferedBackslash) {
buf[off] = '\\';
read++;
off++;
len --;
bufferedBackslash = false;
}
if(len > 1) {
int step = super.read(buf, off, len/2);
for(int i = 0; i < step; i++) {
if(buf[off+i] == '\\') {
// shift everything from here one one char to the right.
System.arraycopy(buf, i, buf, i+1, step - i);
// adjust parameters
step++; i++;
}
}
read += step;
}
return read;
}
}
फिर हम (हमारे गुण वस्तु को यह रीडर पास या बचत होगी: इस प्रकार, मूल स्वरूप में बदलने के लिए, हम बस यह दोगुना करने की जरूरत है, जैसे Grekz एक फ़िल्टर रीडर में, उदाहरण के लिए प्रस्तावित एक नई फाइल के लिए सामग्री)।
इसके बजाए, हम बस इस प्रारूप को स्वयं पार्स कर सकते हैं।
public Properties parse(Reader in) {
BufferedReader r = new BufferedReader(in);
Properties prop = new Properties();
Pattern keyValPattern = Pattern.compile("\s*=\s*");
String line;
while((line = r.readLine()) != null) {
line = line.trim(); // remove leading and trailing space
if(line.equals("") || line.startsWith("#")) {
continue; // ignore empty and comment lines
}
String[] kv = line.split(keyValPattern, 2);
// the pattern also grabs space around the separator.
if(kv.length < 2) {
// no key-value separator. TODO: Throw exception or simply ignore this line?
continue;
}
prop.setProperty(kv[0], kv[1]);
}
r.close();
return prop;
}
फिर, Properties.store()
इस के बाद का उपयोग कर, हम इसे मूल स्वरूप में निर्यात कर सकते हैं।
इस संकेत के लिए धन्यवाद। मैंने संपत्ति फ़ाइलों को लोड और सहेजने के लिए एक स्थिर उपयोगिता वर्ग बनाया था लेकिन आपका तरीका बहुत साफ है। बीटीडब्ल्यू, नेटबैन गुण फ़ाइल (जैसे प्रोजेक्ट.प्रोपर्टीज) को लोड करने के लिए जरूरी है, खासकर गतिशीलता पैक का उपयोग करते समय। – Snicolas