2011-05-31 12 views
22

क्या Properties को आगे की तारीख टिप्पणी जोड़ने के लिए मजबूर करना संभव है? मेरा मतलब है कि यहां पहली पंक्ति की तरह कुछ है:Properties.store() - टाइमस्टैम्प टिप्पणी दबाएं

#Thu May 26 09:43:52 CEST 2011 
main=pkg.ClientMain 
args=myargs 

मैं इसे पूरी तरह से छुटकारा पाना चाहता हूं। मुझे मेरी कॉन्फ़िगरेशन फ़ाइलों को अलग-अलग होने की आवश्यकता है जब तक कि अर्थपूर्ण परिवर्तन न हो।

उत्तर

10

स्रोत कोड या गुणों को देखते हुए, नहीं, यह संभव नहीं है। बीटीडब्लू, चूंकि गुण वास्तव में एक हैश तालिका है और चूंकि इसकी चाबियाँ इस प्रकार क्रमबद्ध नहीं होती हैं, इसलिए आप वैसे भी वही क्रम में गुणों पर भरोसा नहीं कर सकते हैं।

यदि मुझे यह आवश्यकता हो तो मैं गुणों को संग्रहीत करने के लिए कस्टम एल्गोरिदम का उपयोग करूंगा। स्टार्टर के रूप में गुणों के स्रोत कोड का प्रयोग करें।

+1

तथ्य यह नहीं है कि 'स्ट्रिंग.hashCode() 'अच्छी तरह से परिभाषित और स्थिर है कि हैश तालिका में प्रविष्टियों का क्रम सुसंगत है? –

+0

+1 - छोड़ा गया: अच्छा पकड़ो। इस समस्या को पहले और वास्तव में गुणों को "लाइनों का संग्रह" (एक सूची) में डाल दिया गया था, उन्हें वर्णानुक्रम में क्रमबद्ध किया गया और संग्रह को फ़ाइल में छोड़ दिया गया। –

+1

@ कोनराड - गुणों (कुंजी) का एक ही सेट हमेशा एक ही क्रम में मुद्रित किया जाएगा, लेकिन यदि आप एक कुंजी जोड़ते हैं, तो गुण फ़ाइल को शफ़ल किया जा सकता है ... कम से कम कोई गारंटी नहीं है कि अन्य कुंजियां अपना ऑर्डर दें –

9

अनुमान नहीं है। यह टाइमस्टैम्प private method on Properties में मुद्रित है और उस व्यवहार को नियंत्रित करने के लिए कोई संपत्ति नहीं है।

केवल विचार है कि मेरे दिमाग में आता है: उपवर्ग Properties, ऊपर लिख store और कॉपी/ताकि तारीख टिप्पणी प्रिंट नहीं होगा store0 विधि का पेस्ट कर दें।

या - एक कस्टम BufferedWriter कि सभी लेकिन पहली पंक्ति प्रिंट प्रदान करते हैं (जो, अगर आप वास्तविक टिप्पणी जोड़ें असफल हो जायेगी क्योंकि कस्टम टिप्पणियां टाइमस्टैम्प से पहले मुद्रित कर रहे हैं ...)

+0

मैं तुम्हें क्या सुझाव दिया करना पड़ा तरह दिखता है। सबक्लास गुणों को एक सतत प्रकार और कोई टाइमस्टैम्प नहीं मिल सकता है। करने के लिए सबसे अच्छी बात नहीं है, निजी विधि के चिपकने वाला स्रोत कोड कॉपी करना बुरा है। लेकिन यह एकमात्र तरीका है जो मैंने पाया। –

0
सकते हैं

आप नहीं एक सार्थक कॉन्फ़िगरेशन परिवर्तन होने पर बस अपने एप्लिकेशन में फ़्लैग करें और अगर सेट हो तो फ़ाइल केवल लिखें?

आप Commons Configuration में देखना चाहते हैं, जिसमें संपत्ति फ़ाइलों जैसे चीजों को लिखने और पढ़ने की बात आती है। विशेष रूप से, इसमें विधियां हैं जो मौजूदा गुण फ़ाइल के समान सटीक गुण फ़ाइल (स्पेसिंग, टिप्पणियां इत्यादि सहित) लिखने का प्रयास करती हैं।

4

https://stackoverflow.com/a/6184414/242042 के आधार पर यहां मैंने जो कार्यान्वयन लिखा है वह है जो पहली पंक्ति को स्ट्रिप्स करता है और चाबियाँ टाइप करता है।

public class CleanProperties extends Properties { 
    private static class StripFirstLineStream extends FilterOutputStream { 

     private boolean firstlineseen = false; 

     public StripFirstLineStream(final OutputStream out) { 
      super(out); 
     } 

     @Override 
     public void write(final int b) throws IOException { 
      if (firstlineseen) { 
       super.write(b); 
      } else if (b == '\n') { 
       firstlineseen = true; 
      } 
     } 

    } 

    private static final long serialVersionUID = 7567765340218227372L; 

    @Override 
    public synchronized Enumeration<Object> keys() { 
     return Collections.enumeration(new TreeSet<>(super.keySet())); 
    } 

    @Override 
    public void store(final OutputStream out, final String comments) throws IOException { 
     super.store(new StripFirstLineStream(out), null); 
    } 
} 

सफाई इस

final Properties props = new CleanProperties(); 
    try (final Reader inStream = Files.newBufferedReader(file, Charset.forName("ISO-8859-1"))) { 
     props.load(inStream); 
    } catch (final MalformedInputException mie) { 
     throw new IOException("Malformed on " + file, mie); 
    } 
    if (props.isEmpty()) { 
     Files.delete(file); 
     return; 
    } 

    try (final OutputStream os = Files.newOutputStream(file)) { 
     props.store(os, ""); 
    } 
संबंधित मुद्दे