2011-07-18 14 views
28

यदि क्लासपाथ में दो जेएआर फ़ाइलें हैं, तो दोनों में रूट "config.properties" नामक संसाधन शामिल है। दोनों getClass().getResourceAsStream() जैसी फ़ाइलों को पुनर्प्राप्त करने का कोई तरीका है? आदेश प्रासंगिक नहीं है।विभिन्न जारों से एक ही नाम के साथ कई संसाधन फ़ाइलों को कैसे पढ़ा जाए?

एक विकल्प क्लास पथ में प्रत्येक प्रॉपर्टी फ़ाइल को लोड करना होगा जो कुछ मानदंडों से मेल खाता है, यदि यह संभव है।

उत्तर

24

आपको ClassLoader.getResources(name)
(या स्थिर संस्करण ClassLoader.getSystemResources(name)) की आवश्यकता है।

लेकिन दुर्भाग्यवश ऐसे संसाधनों के साथ ज्ञात समस्या है जो "निर्देशिका" के अंदर नहीं हैं। जैसे foo/bar.txt ठीक है, लेकिन bar.txt एक समस्या हो सकती है। यह described well in the Spring Reference है, हालांकि यह किसी भी तरह से वसंत-विशिष्ट समस्या नहीं है।

अद्यतन:

यहाँ एक सहायक विधि है कि InputStreams की सूची लौटाता है:

public static List<InputStream> loadResources(
     final String name, final ClassLoader classLoader) throws IOException { 
    final List<InputStream> list = new ArrayList<InputStream>(); 
    final Enumeration<URL> systemResources = 
      (classLoader == null ? ClassLoader.getSystemClassLoader() : classLoader) 
      .getResources(name); 
    while (systemResources.hasMoreElements()) { 
     list.add(systemResources.nextElement().openStream()); 
    } 
    return list; 
} 

उपयोग:

List<InputStream> resources = loadResources("config.properties", classLoader); 
// or: 
List<InputStream> resources = loadResources("config.properties", null); 
+0

कूल। धन्यवाद! क्या आप एक उदाहरण जोड़ सकते हैं कि इनपुट यूआरटी प्राप्त करने के लिए उन यूआरएल के साथ कैसे आगे बढ़ना है? – Zeemee

+1

@ मूलमोथ: 'यूआरएल' वर्ग में 'ओपनस्ट्रीम' विधि है जो उस यूआरएल के लिए इनपुटस्ट्रीम लौटाती है। आपको बस इतना ही चाहिए। –

+1

@Mmmoth मेरा अपडेट देखें –

0

जार फ़ाइलों ज़िप फ़ाइलें हैं।

ओपन फाइल java.util.zip.ZipFile

का उपयोग कर फिर अपनी प्रविष्टियों गुण की तलाश करके बताना फ़ाइल आप चाहते हैं।

जब आपके पास प्रवेश होता है तो आप अपनी स्ट्रीम प्राप्त कर सकते हैं .getInputStream()

+1

अच्छा विचार है, लेकिन मुझे सामान्य रूप से कोड में जार फ़ाइलों का स्थान और नाम नहीं पता है। – Zeemee

+2

@ मूलमोथ हां आप करते हैं: System.getProperty ("java.class.path") –

+0

@ सेन पैट्रिक फ़्लॉइड: सभी जेएआर फाइल सिस्टम क्लास पथ पर नहीं हैं। उदाहरण के लिए वेब अनुप्रयोगों में, वे सभी प्रकार के स्थानों से आते हैं। – Thilo

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