2010-01-08 9 views
14

मैं अपने आवेदन के गुणों के लिए किए गए परिवर्तन संग्रहीत करने का प्रयास कर रहा हूँ। .properties फ़ाइल resources पैकेज में स्थित है, जो मेरे UI और मॉडल वाले पैकेज से अलग है।जावा OutputStream बराबर getClass()। GetClassLoader() के लिए। GetResourceAsStream()

this.getClass().getClassLoader().getResourceAsStream("resources/settings.properties") 

वहाँ है कि मुझे अनुमति देता है में एक ही .properties फ़ाइल गुण कक्षा में परिवर्तन लागू करने के लिए इस का एक कार्यात्मक समकक्ष है:

मैं पैकेज का उपयोग खोला?

उत्तर

2

ऐसा लगता है कि आप उपयोगकर्ता प्राथमिकताओं को स्टोर करना चाहते हैं। इसके लिए Java Preferences API का उपयोग करने पर विचार करें।

+8

यह उत्तर कैसे चुना जा सकता है? सवाल का जवाब देने के बजाय यह दूसरी तरफ ऐसा करने का सुझाव देता है। यहां तक ​​कि यदि ऐसा करने का दूसरा तरीका बेहतर है, तो यह मूल प्रश्न का उत्तर नहीं दे रहा है। आपको क्या करना चाहिए, जवाब देने के लिए आपको क्या करना चाहिए, और उसके बाद वैकल्पिक तरीका सुझाएं। –

+1

@ फ़ुकुजावा युकिओ: प्रश्न का उत्तर देने के बजाय समस्या को हल करना इस तरह के मामलों में अधिक उपयोगी है। ध्यान दें कि उत्तर * उस व्यक्ति द्वारा चुना जाता है जिसने प्रश्न पूछा *, ऐसा लगता है कि उन्होंने ऐसा भी सोचा था। –

5

जब आप एक जार फ़ाइल के रूप में अपने अनुप्रयोग लपेट, अपने गुण फ़ाइल एक (संभवतः संकुचित) हो जाएगा कि जार के अंदर दाखिल, और यह एक बुरा विचार अपनी खुद की जार करने के लिए लिखने की कोशिश करने के लिए किया जाएगा।

getResourceAsStream() पढ़ने के लिए संसाधनों को खोलने के लिए है, और इन classpath पर कहीं भी हो सकता है। आप यूआरएल या जेएआर के अंदर नहीं लिख सकते हैं, आप केवल फाइलों को लिख सकते हैं, इसलिए आउटपुट के लिए आपको एक ही एपीआई देने के लिए यह समझ में नहीं आता है।

खुद एक निर्देशिका आप में लिखने की अनुमति दी रहे हैं उसे ढूंढें और अपने गुण देखते लिखें।

एप्लिकेशन प्रस्तुति पर पहले ऑपरेशन के रूप में, यदि यह अभी तक मौजूद नहीं है, तो यह आपके फ़ाइल को सीधे अपने इंस्टॉलेशन क्लासपाथ (संभवतः एक जेएआर के अंदर) से कॉपी करना एक अच्छा विचार हो सकता है। यह आपको एक प्रॉपर्टी फ़ाइल देगा जो आप लिख सकते हैं, फिर भी इस प्रॉपर्टी फ़ाइल की मास्टर कॉपी आपके प्रोजेक्ट को डिलीवर करने योग्य से आएगी।

0

Carl's answer के अलावा, यदि आप अक्सर इस फ़ाइल को पढ़ने और लिखने जा रहे हैं, और उम्मीद है कि आपका आवेदन दायरे में विस्तारित होगा, तो विचार करें कि एक कदम (या कई कदम) आगे बढ़ें और फ़ाइल- आधारित डेटाबेस जैसे SQLite। SQLite के लिए कुछ जेडीबीसी रैपर हैं जो आपको जावा स्ट्रिंग कुंजी-वैल्यू लुकअप से परे जाने की अनुमति देंगे जो जावा प्रॉपर्टी इंटरफ़ेस प्रदान करता है।

7

'संसाधनों' पैकेज है, जो पैकेज है कि मेरे यूआई और मॉडल शामिल हैं से अलग है में।

इसके लिए आपको संदर्भ के क्लासलोडर का उपयोग करना चाहिए।

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
properties.load(classLoader.getResourceAsStream("resources/settings.properties")); 

वहाँ है कि मुझे अनुमति देता है में एक ही .properties फ़ाइल गुण कक्षा में परिवर्तन लागू करने के लिए इस का एक कार्यात्मक समकक्ष है?

आप इस के लिए Properties#store() की जरूरत है, जो या तो एक OutputStream या एक Writer ले सकते हैं। सबसे पहले आप गुण फ़ाइल के URL हो और इसके URI मिल इतना है कि आप इस जो आपको एक FileOutputStream में लपेट के लिए एक File बना सकते हैं की जरूरत है।

URL url = classLoader.getResource("resources/settings.properties"); 
properties.store(new FileOutputStream(new File(url.toURI())), null); 
+0

आपकी सहायता के लिए धन्यवाद। – craig

+0

इस तरह से जार फ़ाइल में कोई समस्या है, यूआरआई पदानुक्रमित नहीं है। इसे ठीक करने के लिए कोई संभावित विचार? – xXxpRoGrAmmErxXx

23

सामान्य तौर पर, आप नहीं सामान वापस एक संसाधन आप classloader से मिल गया में डाल कर सकते हैं:

  • कक्षा लोडर संसाधन अक्सर केवल पढ़ने के लिए कर रहे हैं; यानी केवल पढ़ने योग्य फ़ाइलों/केवल-पढ़ने वाली निर्देशिकाओं में आयोजित किया जाता है।

  • यदि आपको एक जेएआर फ़ाइल से संसाधन मिला है, तो जेएआर फाइलें बस अपडेट नहीं हो सकती हैं। ("अद्यतन" करने के लिए आपको पुरानी जार की सामग्री निकालने और अद्यतन सामग्री के साथ एक नया जार बनाने की आवश्यकता है। यह ज़िप फ़ाइलों की संरचना के साथ सब कुछ है ...)

  • कुछ मामलों में, वर्ग लोडर संसाधन ऑन-द-फ्लाई डाउनलोड किया जाएगा, और उस स्थान पर परिवर्तन को वापस धक्का देने का कोई तरीका नहीं है जहां से आपने डाउनलोड किया था।

भले ही आप क्लासलोडर से प्राप्त संसाधन को अपडेट कर सकें, यह एक बुरा विचार/बुरा अभ्यास है।

  • यह "प्रदूषण" उपयोगकर्ता की प्राथमिकताओं के साथ स्वच्छ अनुप्रयोग स्थापना करना। अन्य चीजों के अलावा, इसका मतलब है कि स्थापना को अन्य उपयोगकर्ताओं के साथ साझा नहीं किया जा सकता है (जब तक कि आप एकाधिक उपयोगकर्ताओं के लिए वरीयताओं को संभाल नहीं लेते ...)।

  • लिखने योग्य के रूप में अनुप्रयोग स्थापित करने के साथ सुरक्षा समस्याएं हैं ताकि एम्बेडेड वरीयताओं को अपडेट किया जा सके। वायरस सोचो! एक ऐसे उपयोगकर्ता को सोचें जो किसी अन्य उपयोगकर्ता की प्राथमिकताओं को कचरा करने के इच्छुक हो!

  • एप्लिकेशन की उपयोगकर्ता-विशिष्ट प्रतियों के साथ प्रशासनिक समस्याएं हैं। और यदि उपयोगकर्ता को ऐप की अपनी प्रति इंस्टॉल करना है, तो उसके साथ संभावित सुरक्षा समस्याएं भी हैं।

अंत में, यह तरीका नहीं है कि सिस्टम प्रशासक (और शिक्षित उपयोगकर्ता) सॉफ़्टवेयर से व्यवहार करने की अपेक्षा करते हैं।

  • एक जावा केंद्रित समाधान Java Preferences API का उपयोग के लिए: यह उम्मीद तरह से उपयोगकर्ता वरीयताओं के साथ सौदा करने के लिए सबसे अच्छा अभ्यास है।

  • वैकल्पिक रूप से, आप write a Properties file को ओएस-उपयुक्त उपयोगकर्ता-लेखन योग्य निर्देशिका में प्राथमिकताएं दे सकते हैं।

  • विंडोज़ पर, आप Windows रजिस्ट्री (यक) में वरीयताओं को संग्रहीत करने के लिए Windows- विशिष्ट API का उपयोग कर सकते हैं।

+0

बिग +1। बुद्धिमानी के शब्द। –

+0

आपके विचारों के लिए धन्यवाद। – craig