कैसे अपनी परियोजना के / संसाधन फ़ोल्डर में फ़ाइल के लिए पूर्ण पथ प्राप्त करने के लिए


93

मानक मावेन सेटअप मान लें।

अपने संसाधन फ़ोल्डर में कहें कि आपके पास एक फ़ाइल है abc

जावा में, मैं कृपया फ़ाइल को पूर्ण पथ कैसे प्राप्त कर सकता हूं?


क्या आप मावेन प्लगइन लिखना चाहते हैं? या क्या आप उस फ़ाइल को एक्सेस करना चाहते हैं जब आपका प्रोग्राम निष्पादित होता है?
ग्यारो गियरलेस


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

जवाबों:


72

आप ClassLoader.getResourceसही संसाधन प्राप्त करने के लिए विधि का उपयोग कर सकते हैं ।

URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();

या

हालांकि यह हर समय काम नहीं कर सकता है, एक सरल समाधान -

आप एक Fileवस्तु और उपयोग getAbsolutePathविधि बना सकते हैं :

File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();

8
सीमित उपयोग की एक सलाह, क्योंकि यह मावेन रूट होने के लिए कार्यशील निर्देशिका पर निर्भर करती है। और फिर भी, आपको target/classes/abc.txtफ़ाइल को संदर्भित करने के लिए उपयोग करना चाहिए , क्योंकि यह कैनोनिकल जगह है जहां मावेन प्रसंस्करण के बाद संसाधन फ़ाइलें डालता है (उदाहरण के लिए, मावेन-संसाधन प्लगइन ने शायद abc.txt पर संपत्ति प्रतिस्थापन किया है)। Classpath से getResource () के माध्यम से abc.txt का उपयोग करना बेहतर है।
ग्यारो गियरलेस

2
क्या होगा अगर एक अंतिम-उपयोगकर्ता आपके एप्लिकेशन को निष्पादन योग्य JAR के रूप में चला रहा है? तो वहाँ एक भौतिक फ़ाइल बिल्कुल नहीं होगा। यह एक और कारण है कि आपको getResource () का उपयोग करना चाहिए, और उदाहरण के लिए उस पर खुली इनपुट स्ट्रीम पर निर्भर करता है कि आप इसके साथ क्या करना चाहते हैं।
मैथ्यू वाइज

6
क्या इसे सही उत्तर के रूप में हटाया जा सकता है? @ करोल एस ने नीचे उत्तर दिया - यह सही उत्तर होना चाहिए (इसलिए
अपवित्रता

3
गलत जवाब। कृपया नीचे दिए गए उत्तर को देखें @Karol
bhathiya-perera

167

उचित तरीका जो वास्तव में काम करता है:

URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();

इससे कोई फर्क नहीं पड़ता कि भौतिक रूप से क्लासपाथ में फ़ाइल कहाँ है, यह तब तक पाया जाएगा जब तक कि संसाधन वास्तव में एक फ़ाइल नहीं है और JAR प्रविष्टि नहीं है।

(स्पष्ट रूप से स्पष्ट new File(resource.getPath())सभी रास्तों के लिए काम नहीं करता है! पथ अभी भी URL-एन्कोडेड है!)


5
या शायद आप बस कर सकते हैं: new File(resource.toURI()).getAbsolutePath();(यानी मुझे नहीं लगता कि आपको पथ वस्तु की आवश्यकता है?)
दान राजा

1
TOURI () के बारे में अच्छी टिप, यह आपके रास्ते में आने वाले स्थानों को% 20 से बाहर आने से बचाती है!
मैथ्यू वाइज

29
धन्यवाद! यह लगभग मेरे लिए काम किया। लेकिन मुझे एक बदलाव करना था: YourClass.class.getClassLoader ()। GetResource ("abb");
yngwietiger

new File(YourClass.class.getResource("abc").toURI().getPath())यदि आप चाहते तो आप वैकल्पिक रूप से कर सकते थे।
18 Ry में माइक राइनलर

2
मुझे समझ में नहीं आता है कि इसने कितने लोगों के लिए काम किया है, जो बिना स्लैश के शुरू करते हैं:.getResource("/abc")
cahen

28

आपको निर्दिष्ट पथ को शुरू करने की आवश्यकता है /

URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();

12

जिस वर्ग की आपको आवश्यकता है, उसका क्लास-बेडर उदाहरण बनाएं, फिर आप फ़ाइलों या संसाधनों तक आसानी से पहुँच सकते हैं। अब आप getPath()उस वर्ग की विधि का उपयोग करके पथ तक पहुँचते हैं ।

 ClassLoader classLoader = getClass().getClassLoader();
 String path  = classLoader.getResource("chromedriver.exe").getPath();
 System.out.println(path);

1

किसी फ़ाइल या फ़ाइलपथ पर लौटने के लिए

URL resource = YourClass.class.getResource("abc");
File file = Paths.get(resource.toURI()).toFile(); // return a file
String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath();  // return file path

0

निरपेक्ष मार्ग के लिए हमारे रास्ते में दो समस्याएं हैं:

  1. पाया गया प्लेसमेंट वह नहीं होगा, जहां स्रोत फ़ाइलें झूठ हैं, लेकिन जहां कक्षा बचाई गई है। और संसाधन फ़ोल्डर लगभग निश्चित रूप से परियोजना के स्रोत फ़ोल्डर में कहीं झूठ होगा।
  2. संसाधन को पुनः प्राप्त करने के लिए एक ही कार्य अलग से कार्य करता है यदि वर्ग एक प्लगइन में या सीधे कार्यक्षेत्र में एक पैकेज में चलता है।

निम्नलिखित कोड हमें सभी उपयोगी रास्ते देगा:

    URL localPackage = this.getClass().getResource("");
    URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation();
    String localDir = localPackage.getPath();
    String loaderDir = urlLoader.getPath();
    System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);

यहां संसाधन फ़ोल्डर के स्थानीयकरण के लिए उपयोग किए जा सकने वाले दोनों कार्यों पर शोध किया जाता है। जैसा कि class, यह किसी भी तरह से, सांख्यिकीय या गतिशील रूप से प्राप्त किया जा सकता है।


यदि परियोजना प्लगइन में नहीं है, तो कोड जो जुनाइट में चलता है, प्रिंट होगा:

loaderDir = /C:.../ws/source.dir/target/test-classes/
 localDir = /C:.../ws/source.dir/target/test-classes/package/

तो, src / rest / resource को प्राप्त करने के लिए हमें फ़ाइल ट्री के ऊपर और नीचे जाना चाहिए। दोनों तरीकों का इस्तेमाल किया जा सकता है। ध्यान दें, हम उपयोग नहीं कर सकते getResource(resourceFolderName), उस फ़ोल्डर के लिए लक्ष्य फ़ोल्डर में नहीं है। कोई भी बनाए गए फ़ोल्डर में संसाधन नहीं डालता है, मुझे उम्मीद है।


यदि क्लास उस पैकेज में है जो प्लगइन में है, उसी टेस्ट का आउटपुट होगा:

loaderDir = /C:.../ws/plugin/bin/
 localDir = /C:.../ws/plugin/bin/package/

इसलिए, फिर से हमें फ़ोल्डर ट्री के ऊपर और नीचे जाना चाहिए।


सबसे दिलचस्प मामला है जब पैकेज को प्लगइन में लॉन्च किया जाता है। JUnit प्लगइन परीक्षण के रूप में, हमारे उदाहरण के लिए। आउटपुट है:

loaderDir = /C:.../ws/plugin/
 localDir = /package/

यहां हम दोनों कार्यों के परिणामों को मिलाकर ही पूर्ण मार्ग प्राप्त कर सकते हैं । और यह पर्याप्त नहीं है। उन दोनों के बीच हमें उस स्थान का स्थानीय पथ रखना चाहिए जहां कक्षाएं पैकेज हैं, अपेक्षाकृत प्लगइन फ़ोल्डर में। संभवतः, आपको यहां srcया इसके साथ कुछ डालना होगा src/test/resource

आप कोड को अपने में सम्मिलित कर सकते हैं और आपके पास जो रास्ते हैं उन्हें देख सकते हैं।

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