2008-10-11 12 views
21

मैं अपने आवेदन के लिए कुछ सेटिंग्स स्टोर करने के लिए एक आईएनआई फ़ाइल बनाना चाहता हूं। क्या यह जानना एक अच्छा विचार है कि जार फ़ाइल कहां स्थित है और वहां एक आईएनआई फाइल बना रही है? यदि हां, तो मैं जार फ़ाइल का स्थान कैसे ढूंढ सकता हूं?जावा में कुछ सेटिंग्स को स्टोर करने के लिए .INI फ़ाइल कैसे बनाएं?

लेकिन यदि आप इस तरह के किसी के लिए बेहतर समाधान जानते हैं, तो मैं उनमें से कुछ सुनना चाहता हूं।

संपादित करें: मै मैक का उपयोग कर रहा हूं और मैं विंडोज़ में एक ही एप्लीकेशन चलाने के लिए चाहता हूं। मैं System.getProperty ("user.home") निर्देशिका में कुछ लिख सकता हूं, लेकिन यदि उपयोगकर्ता ऐप को हटाने का निर्णय लेता है, तो मैं सिस्टम को साफ रखना चाहता हूं। सेटिंग्स फ़ाइल को स्टोर करने का कोई बेहतर तरीका नहीं है, उदाहरण के लिए एप्लिकेशन के साथ एक ही निर्देशिका में?

उत्तर

22

आप क्लासलोडर का उपयोग कर अपनी एप्लिकेशन निर्देशिका का पता लगा सकते हैं। देखें: Java: finding the application directory.INI फ़ाइल के बजाय, का उपयोग करें .properties फ़ाइल - आप इसे Properties कक्षा के माध्यम से लोड और सहेज सकते हैं।

जैसा कि अन्य ने नोट किया है, आपको अपनी एप्लिकेशन निर्देशिका में उपयोगकर्ता सेटिंग्स नहीं लिखनी चाहिए। क्या होगा यदि उपयोगकर्ता के पास आवेदन निर्देशिका में लेखन पहुंच नहीं है? क्या होगा यदि एक ही सिस्टम पर एक ही सिस्टम पर एकाधिक उपयोगकर्ताओं द्वारा आपके एप्लिकेशन का उपयोग किया जा रहा है? विंडोज़ पर भी इन परिस्थितियों में से कोई भी असामान्य नहीं है।

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

/home/user/.eclipse 
C:\Documents and Settings\User\.eclipse 

:

एक आम सम्मेलन उपयोगकर्ता के घर निर्देशिका के लिए उपयोगकर्ता सेटिंग को बचाने के लिए है। रीडमे में ऐसी चीजें दस्तावेज करें।

public static File getSettingsDirectory() { 
    String userHome = System.getProperty("user.home"); 
    if(userHome == null) { 
     throw new IllegalStateException("user.home==null"); 
    } 
    File home = new File(userHome); 
    File settingsDirectory = new File(home, ".myappdir"); 
    if(!settingsDirectory.exists()) { 
     if(!settingsDirectory.mkdir()) { 
      throw new IllegalStateException(settingsDirectory.toString()); 
     } 
    } 
    return settingsDirectory; 
} 

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

1

आपको किसी एप्लिकेशन की इंस्टॉल निर्देशिका में अस्थायी फ़ाइलों को संग्रहीत नहीं करना चाहिए। याद रखें, एप्लिकेशन चलाने वाले उपयोगकर्ता के पास उस निर्देशिका में लेखन पहुंच नहीं हो सकती है। इस तरह की चीजें रखने के लिए सबसे सुरक्षित स्थान सी: \ दस्तावेज़ और सेटिंग्स \ उपयोगकर्ता नाम \ अनुप्रयोग डेटा \ अनुप्रयोगनाम फ़ोल्डर (आवश्यकतानुसार नाम समायोजित करना) में है।

यह कहा गया कि, हालांकि, मैं संभवतः उस कंप्यूटर की फाइल के बजाय रजिस्ट्री में उस प्रकार की सामग्री संग्रहीत करूंगा। (लेकिन, यह सिर्फ मुझे है।)

+0

और के बारे में क्या MacOS में एक ही आवेदन चल रहा है ?? और मैं पूरी तरह से इस आलेख से सहमत हूं .. http://www.codinghorror.com/blog/archives/000939.html तो मुझे लगता है कि रजिस्ट्री बिल्कुल अच्छा विचार नहीं है :) – Lipis

1

यह निर्भर करता है कि आपकी आईएनआई को सामान्य परिस्थितियों में मानव पठनीय/लिखने योग्य होना चाहिए या नहीं। यदि नहीं, तो आप एक आईएनआई फ़ाइल की बजाय गुण फ़ाइल का उपयोग कर सकते हैं, और इसे "उपयोगकर्ता" निर्देशिका में संग्रहीत कर सकते हैं।

जार फ़ाइल को खोजने के लिए के रूप में, आप एक वर्ग जार से लोड किया जाना जाना जाता के लिए classloader खोजने के लिए जाँच करेगा कि यह classloader (यानी की उचित प्रकार यह है कि वास्तव में एक जार से लोड किया गया था), और आप उस से पथ निकाल सकते हैं। यदि आप वास्तव में चाहते हैं तो मैं शायद ऐसा करने के लिए कोड खोद सकता हूं। मैं जरूरी नहीं कि इसकी सिफारिश करूंगा।

EDIT उपयोगकर्ता। होम संपत्ति आपको उपयोगकर्ता निर्देशिका देगी, जिसे आप सुरक्षित रूप से उपयोग कर सकते हैं।

+0

user.dir आपको वर्तमान कामकाजी डीआईआर देता है , जो सुरक्षित या उपयुक्त नहीं हो सकता है। user.home आपको उपयोगकर्ता की होम निर्देशिका देता है। –

+0

क्या यह सुनिश्चित करने के लिए सुरक्षित है कि 'user.home' संपत्ति आपको प्रत्येक पर्यावरण के लिए उपयुक्त मान देती है? यह है,/home/{user} * nix पर, प्रासंगिक दस्तावेज़ और सेटिंग्स विंडोज़ के लिए उपनिर्देशिका, आदि? – Andrew

+0

यही 'user.home' करना है। –

1

आम तौर पर जावा प्रोग्रामर .ini फ़ाइलों का उपयोग नहीं करते हैं, लेकिन .properties फ़ाइलें (विभिन्न प्रारूप)। यदि आप ऐसा करते हैं तो आप java.lang.Properties क्लास को एक अच्छा प्रोग्रामैटिक रैपर के रूप में उपयोग कर सकते हैं।

आप यह करते हैं कि सिफारिश नहीं आप अपने जार फ़ाइल का स्थान। GetLocation() अपनी कक्षा के .class सदस्य पर getProtectionDomain()। GetCodeSource() कॉल करके मिलता है, मैं सकते हैं।

मैं इसके बजाय फ़ाइल को सिस्टम.getProperty ("user.home") निर्देशिका में लिखूंगा - उपयोगकर्ता की होम निर्देशिका, या यदि यह वास्तव में अस्थायी है, System.getProperty ("java.io.tmpdir")

+0

हम्म ... मैं जावा में नोब हूं, इसलिए हाँ। प्रॉपर्टीज एक बेहतर विचार है। लेकिन जब आप जावा में कोई एप्लिकेशन लिख रहे हों, तो आप अपनी सेटिंग्स कहां स्टोर करते हैं। मैं मैक का उपयोग कर रहा हूं, लेकिन मैं इसे विंडोज वातावरण में भी चलाने के लिए चाहता हूं। – Lipis

8

यदि सेटिंग्स केवल आपके एप्लिकेशन द्वारा लिखी गई हैं (मैन्युअल रूप से संपादित करने के बजाय), Preferences API का उपयोग करने पर विचार करें।

1

आईएनआई फ़ाइल के बजाय .properties फ़ाइल के साथ विचार अच्छा है। साथ ही, यदि आप वहां कुछ संवेदनशील डेटा संग्रहीत करते हैं, तो आप इसे एन्क्रिप्ट करने पर विचार कर सकते हैं। इस की जाँच करें:

https://www.owasp.org/index.php/How_to_encrypt_a_properties_file

या इस:

encrypt and decrypt property file value in java

संबंधित मुद्दे

 संबंधित मुद्दे