java.io.File
और पत्नी के स्थानीय डिस्क फाइल सिस्टम पर काम करता है। आपकी समस्या का मूल कारण यह है कि सापेक्ष पथ java.io
वर्तमान कार्य निर्देशिका पर निर्भर हैं। यानी वह निर्देशिका जिसमें से JVM (आपके मामले में: वेबसर्वर एक) शुरू किया गया है। इस उदाहरण के लिए हो सकता है C:\Tomcat\bin
या कुछ और पूरी तरह से अलग है, लेकिन इस प्रकार नहीं C:\Tomcat\webapps\contextname
या जो भी आप इसे होने की उम्मीद थी। एक सामान्य ग्रहण परियोजना में, यह होगा C:\Eclipse\workspace\projectname
। आप निम्न तरीके से वर्तमान कार्य निर्देशिका के बारे में जान सकते हैं:
System.out.println(new File(".").getAbsolutePath());
हालाँकि, वर्किंग डायरेक्टरी किसी भी तरह से प्रोग्रामेबल कंट्रोल करने योग्य नहीं है। आपको वास्तव में एपीआई के सापेक्ष पथ के बजाय पूर्ण पथ का उपयोग करना चाहिए File
। जैसे C:\full\path\to\file.ext
।
आप जावा (वेब) अनुप्रयोगों में पूर्ण पथ को हार्डकोड या अनुमान नहीं करना चाहते हैं। यह केवल पोर्टेबिलिटी परेशानी है (यानी यह सिस्टम X में चलता है, लेकिन सिस्टम Y में नहीं)। सामान्य अभ्यास क्लासपाथ में उन प्रकार के संसाधनों को रखना है , या क्लासपाथ के लिए अपना पूरा रास्ता जोड़ना है (जैसे आईडीई में वह src
फ़ोल्डर और "बिल्ड पथ" क्रमशः)। इस तरह से आप की मदद से उन्हें प्राप्त कर सकते हैं ClassLoader
द्वारा ClassLoader#getResource()
या ClassLoader#getResourceAsStream()
। यह क्लासपैथ के "रूट" के सापेक्ष फाइलों का पता लगाने में सक्षम है, जैसा कि आप संयोग से समझ गए हैं। वेबएप्लिकेशंस (या किसी भी अन्य एप्लिकेशन में जो कई क्लास लोडर का उपयोग करता है) के लिए इसके ClassLoader
द्वारा लौटाए गए का उपयोग करने की सिफारिश की जाती है Thread.currentThread().getContextClassLoader()
ताकि आप वेबएप संदर्भ को "बाहर" भी देख सकें।
Webapps में एक और विकल्प है ServletContext#getResource()
और इसका समकक्ष ServletContext#getResourceAsStream()
। यह web
फ़ोल्डर सहित वेबप प्रोजेक्ट के सार्वजनिक फ़ोल्डर में स्थित फ़ाइलों तक पहुँचने में सक्षम है /WEB-INF
। ServletContext
विरासत में मिली द्वारा सर्वलेट्स में उपलब्ध है getServletContext()
विधि, आप कॉल कर सकते हैं यह रूप में है।
यह सभी देखें: