प्रोग्रामिक रूप से संसाधन निर्देशिका पथ कैसे प्राप्त करें


86

मेरे पास निम्नलिखित निर्देशिका लेआउट है:

  • src
    • मुख्य
      • जावा
      • साधन
        • sql (डेटाबेस के लिए स्क्रिप्ट)
        • वसंत (विन्यास)
      • वेब अप्प

ServletContextListener वर्ग के भीतर, मैं SQL निर्देशिका के अंतर्गत फ़ाइलों को एक्सेस करना चाहता हूं और उन्हें सूचीबद्ध करना चाहता हूं। मूल रूप से मेरी समस्या पथ के साथ है, क्योंकि मुझे पता है कि निर्देशिका में फाइलों को संक्षेप में सूचीबद्ध करना है:

File folder = new File(path);
File[] listOfFiles = folder.listFiles();

हो सकता है कि मैं ServletContextEventवस्तु का उपयोग करने की कोशिश करूं और निर्माण करूंresources/sql

public void contextInitialized(ServletContextEvent event) {
    event.getServletContext(); //(getRealPath etc.)
}

क्या किसी रिश्तेदार, गैर-हार्डकोड तरीके से उस रास्ते को सेट करने के लिए कुछ मौजूद है? कुछ इस तरह new File("classpath:sql")(अधिमानतः वसंत यदि संभव हो) या मुझे सर्वलेटकोटेक्स्ट के साथ क्या करना चाहिए resources/sql?


स्थिति के आधार पर, समाधान के तीन संस्करण हैं: stackoverflow.com/a/56327069/715269
गंगानस

जवाबों:


69

मैं मान रहा हूं कि बिल्ड समय में आपके .war के अंदर src/main/resources/कॉपी की गई सामग्री है WEB-INF/classes/। यदि ऐसा है तो आप बस कर सकते हैं (क्लासनाम और लोड किए जा रहे पथ के लिए वास्तविक मानों का प्रतिस्थापन)।

URL sqlScriptUrl = MyServletContextListener.class
                       .getClassLoader().getResource("sql/script.sql");

धन्यवाद!! यह मेरे लिए काम करता है, उस URL के साथ फिर मैं नई फ़ाइल के लिए पथ का निर्माण करता हूं, और अंत में उस निर्देशिका में फाइलें प्राप्त करता हूं।
यमिलामेडिना

2
आपको फ़ाइल की आवश्यकता नहीं है। आपके पास पहले से ही एक URL है। आप यह भी नहीं मान सकते कि कोई फ़ाइल या निर्देशिका है। WAR को अनपैक नहीं किया गया है।
को लोर्ने का मार्किस

MyServletContextListener का यहां क्या मतलब है?
तेजेश राउत

@TejeshRaut इसे लागू करने वाले वर्ग के लिए एक स्थान धारक है javax.servlet.ServletContextListener। मैंने इसका उपयोग एक उदाहरण के रूप में किया क्योंकि प्रश्न में एक स्निपेट था contextInitialized जिसमें से ServletContextListenerइंटरफ़ेस द्वारा परिभाषित एक विधि है।
देव

59

अंत में, यह वही है जो मैंने किया था:

private File getFileFromURL() {
    URL url = this.getClass().getClassLoader().getResource("/sql");
    File file = null;
    try {
        file = new File(url.toURI());
    } catch (URISyntaxException e) {
        file = new File(url.getPath());
    } finally {
        return file;
    }
}

...

File folder = getFileFromURL();
File[] listOfFiles = folder.listFiles();

11
क्या आप "/sql"पैरामीटर के रूप में उपयोग करने के बारे में सुनिश्चित हैं ? मुझे शुरुआती स्लैश की समस्या है, इसके बजाय "sql"काम करता है।
अब्दुल

2
कृपया ध्यान रखें कि आप इस .getClass () के साथ एक अलग URL प्राप्त कर सकते हैं। getResource ("/ sql"));
शैडोगेम

यह सभी कंटेनरों पर काम नहीं करेगा। मिसाल के तौर पर तोमकैट।
लोर्ने

16
import org.springframework.core.io.ClassPathResource;

...

File folder = new ClassPathResource("sql").getFile();
File[] listOfFiles = folder.listFiles();

यह ध्यान देने योग्य है कि यह आपके परिनियोजन विकल्पों को सीमित कर देगा, ClassPathResource.getFile()केवल तभी काम करेगा जब कंटेनर आपके युद्ध फ़ाइल को विस्फोटित (अनज़िप्ड) कर दिया हो।


6

बस com.google.common.io.Resources वर्ग का उपयोग करें । उदाहरण:

 URL url = Resources.getResource("file name")

उसके बाद आपके पास तरीके हैं: .getContent (), .getFile (), .getPath () आदि


1
क्या वे संसाधन प्राप्त करने में भी सहायता करते हैं जबकि कोड को जार फ़ाइल से निष्पादित किया जा रहा है?
डिसिप्लिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.