2012-04-19 19 views
7

मैं java.util.prefs का उपयोग कर रहा हूं। एप्लिकेशन वरीयताओं के लिए संदर्भ। और मुझे मैन्युअल रूप से उन प्राथमिकताओं को संपादित करने की क्षमता चाहिए। क्या यह विंडोज रजिस्ट्री के बजाय फ़ाइल में स्टोर करना संभव है? या मुझे java.util.prefs के संदर्भ में एक और तंत्र का उपयोग करना चाहिए। संदर्भ?फ़ाइल में java.util.prefs.Preferences को कैसे स्टोर करें?

+0

[java.util.Properties] (http://download.oracle.com/javase/tutorial/essential/environment/properties.html) हो सकता है? यद्यपि प्राथमिकताओं की तुलना में यह कम ठीक है। – BalusC

+0

मुझे लगता है कि आपने अभी तक [Javadoc] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/prefs/Preferences.html) का सहारा नहीं लिया है। ऐसा करें और देखें कि क्या आपके पास अभी भी कुछ पूछना है या नहीं। –

+2

@ मार्कोटोपॉलिक का मतलब था "यह डेटा एक कार्यान्वयन-निर्भर बैकिंग स्टोर में लगातार संग्रहित होता है।विशिष्ट कार्यान्वयन में फ्लैट फाइलें, ओएस-विशिष्ट रजिस्ट्री, निर्देशिका सर्वर और एसक्यूएल डेटाबेस शामिल हैं। ** इस वर्ग के उपयोगकर्ता को बैकिंग स्टोर के विवरण से संबंधित नहीं होना चाहिए। ** "??? – denys

उत्तर

6

आप प्राथमिकताएं API का उपयोग जारी रखने के लिए, लेकिन एक फाइल करने के लिए लिखना चाहते हैं, तो आप एक नया PreferencesFactory, के रूप में this SO post में विस्तृत आवश्यकता होगी।

0

यह एक और पोस्ट में समझाया गया है, here

Properties prop = new Properties(); 
InputStream in = getClass().getResourceAsStream("foo.properties"); 
prop.load(in); 
in.close() 
+0

क्षमा करें - यह वही नहीं है। [अन्य तंत्रों के लिए प्राथमिकता API की तुलना करना] (http://docs.oracle.com/javase/1.5.0/docs/guide/preferences/index.html#prefs-other)। वहां खिड़कियों में दो जगहें हैं जहां वरीयताओं को रखा जा सकता है। रजिस्ट्री या% APPDATA%। QSettings (Qt Framework) में Fe मैं उन 2 विकल्पों के बीच चयन कर सकता हूं ... – denys

+2

क्षमा करें, मैंने गलत समझा है। इसके बारे में क्या? मैं परीक्षण नहीं कर सका लेकिन ऐसा लगता है क आप पर देख रहे हैं http://www.davidc.net/programming/java/java-preferences-using-file-backing-store –

+0

बहुत बेहतर। धन्यवाद, @ एमईके। – denys

5

आप नीचे दिए गए दो विधि का उपयोग करना चाहते करने जा रहे हैं:

Preferences.exportSubtree(OutputStream os) 

और

Preferences.importPreferences(InputStream is) 
0

मुझे लगता है कि आप के बजाय संपत्ति फ़ाइलों का उपयोग कर सकते हैं। वे फाइल सिस्टम में संग्रहीत हैं। आप जिस मार्ग को चाहते हैं उसे परिभाषित कर सकते हैं। और आप इसे हाथ से संपादित कर सकते हैं। अधिक जानकारी के लिए this question देखें।

2

इस कोड की मदद करनी चाहिए आप [http://java.sun.com/developer/technicalArticles/releases/preferences/]:

public class PrefSave { 

private static final String PACKAGE = "/pl/test"; 

public static void main(String[] args) { 
    doThings(Preferences.systemRoot().node(PACKAGE)); 
    doThings(Preferences.userRoot().node(PACKAGE)); 
} 

public static void doThings(Preferences prefs) { 
    prefs.putBoolean("Key0", false); 
    prefs.put("Key1", "Value1"); 
    prefs.putInt("Key2", 2); 

    Preferences grandparentPrefs = prefs.parent().parent(); 
    grandparentPrefs.putDouble("ParentKey0", Math.E); 
    grandparentPrefs.putFloat("ParentKey1", (float) Math.PI); 
    grandparentPrefs.putLong("ParentKey2", Long.MAX_VALUE); 

    String fileNamePrefix = "System"; 
    if (prefs.isUserNode()) { 
     fileNamePrefix = "User"; 
    } 
    try { 
     OutputStream osTree = new BufferedOutputStream(
       new FileOutputStream(fileNamePrefix + "Tree.xml")); 
     grandparentPrefs.exportSubtree(osTree); 
     osTree.close(); 

     OutputStream osNode = new BufferedOutputStream(
       new FileOutputStream(fileNamePrefix + "Node.xml")); 
     grandparentPrefs.exportNode(osNode); 
     osNode.close(); 
    } catch (IOException ioEx) { 
     // ignore 
    } catch (BackingStoreException bsEx) { 
     // ignore too 
    } 
} 
0

कुछ समय पहले मैं के एक कार्यान्वयन के साथ आने के लिए था वरीयता वर्ग जो सेटिंग्स को पढ़ेगा लेकिन रजिस्ट्री को नहीं लिखेंगे। मैंने इसे पूरा करने के लिए सार तत्वों से एक ReadOnlyPreferences कक्षा प्राप्त की है। बाद में, मुझे इस सटीक कार्यक्षमता की आवश्यकता थी जिसे आपको फ़ाइलों से/जाने के लिए आवश्यक है। फ़ाइल को सिंक में रखने के लिए मैंने सिंक() और फ्लश() को ओवरराइड करने के लिए बस मेरी ReadOnlyPreferences क्लास को बढ़ाया है। इसके बारे में अच्छा हिस्सा यह सटीक उसी तर्क का उपयोग करेगा, जो कि प्राइस के डिफ़ॉल्ट उपयोग की तरह मानों पर डिफ़ॉल्ट लागू करने के लिए है क्योंकि वास्तव में पढ़ने के लिए रजिस्ट्री में कुछ भी मौजूद नहीं है। मैंने बेस क्लास से exportSubtree() और importPreferences() का उपयोग करके फ़ाइल को सिंक में रखा ताकि मेरे लिए सभी भारी उठाने लगे।

मुझे खेद है कि मैं कोड पोस्ट नहीं कर सकता क्योंकि मेरे पास इसका स्वामित्व नहीं है, लेकिन मैंने एन्क्रिप्टेड वरीयताओं का उपयोग किया जो आप निम्न बिंदु पर प्रारंभ बिंदु के रूप में पा सकते हैं। मैंने यही किया और मुझे बस इतना ही घंटों तक पहुंचने में लगा कि मुझे जो चाहिए वह मुख्य रूप से कोड को फेंक रहा है जो कोड लिखने से कहीं ज्यादा आसान है! यदि आप पहले व्यक्ति पर क्लिक नहीं करना चाहते हैं तो यह डॉ। डॉब्स में निम्न लिंक पर भी प्रकाशित है। मैंने पूरे स्रोत को डाउनलोड करने के लिए डॉब्स आलेख पर कभी भी एक आसान जगह नहीं देखी। भले ही, लेख प्राथमिकता सामग्री को विस्तारित करने के लिए मैंने देखा है सबसे अच्छा है।

http://www.panix.com/~mito/articles/#ep

http://www.drdobbs.com/security/encrypted-preferences-in-java/184416587?pgno=4

-1

निम्नलिखित वर्ग जो आप एक स्थानीय configuration.xml फ़ाइल का उपयोग कर कुछ सरल put() और get() कार्यों का उपयोग करने की अनुमति देता का प्रयास करें।

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.InvalidPropertiesFormatException; 
import java.util.Properties; 

public class SimpleProperties 
{ 
    private String propertiesFilePath; 
    private Properties properties; 

    public SimpleProperties() throws InvalidPropertiesFormatException, IOException 
    { 
     propertiesFilePath = "configuration.xml"; 
     properties = new Properties(); 

     try 
     { 
      properties.loadFromXML(new FileInputStream(propertiesFilePath)); 
     } catch (InvalidPropertiesFormatException e) 
     { 

     } 
    } 

    public void put(String key, String value) throws FileNotFoundException, IOException 
    { 
     properties.setProperty(key, value); 

     store(); 
    } 

    public String get(String key) 
    { 
     return properties.getProperty(key); 
    } 

    private void store() throws FileNotFoundException, IOException 
    { 
     String commentText = "Program parameters"; 

     properties.storeToXML(new FileOutputStream(propertiesFilePath), commentText); 
    } 
} 
संबंधित मुद्दे