2011-08-25 20 views
6

मैं एक ऐसे प्रोजेक्ट के साथ काम कर रहा हूं जो मानक मैवेन निर्देशिका संरचना का उपयोग कर सेटअप कर रहा है, इसलिए मेरे पास "संसाधन" नामक एक फ़ोल्डर है और इसके भीतर मैंने "फोंट" नामक फ़ोल्डर बनाया है और फिर इसमें एक फ़ाइल डाली है। मुझे एक ऐसी पार्टी में पूर्ण String फ़ाइल पथ (मेरी प्रोजेक्ट स्ट्रक्चर के भीतर, resources/fonts/somefont.ttf पर स्थित एक फ़ाइल का), एक तृतीय पक्ष लाइब्रेरी से नीचे उपयोग करने की आवश्यकता है, मैंने इसे थोड़ी देर के लिए खोजा है लेकिन ऐसा करने के उचित तरीके के रूप में थोड़ा उलझन में हो गए हैं। मैंने नीचे की कोशिश की है लेकिन यह इसे खोजने में सक्षम नहीं है। मैंने ResourceBundle का उपयोग करने पर ध्यान दिया लेकिन ऐसा लगता है कि मुझे वास्तविक File ऑब्जेक्ट बनाने में शामिल होना प्रतीत होता है जब मुझे नीचे दिए गए तरीके की तरह एक विधि में जाने के लिए पथ की आवश्यकता होती है (मेरे सामने वास्तविक विधि कॉल नहीं है, इसलिए बस मेरे द्वारा एक उदाहरण दें स्मृति):जावा (मेवेन वेब ऐप), संसाधन फ़ोल्डर में फ़ाइल के लिए पूर्ण फ़ाइल पथ प्राप्त कर रहा है?

FontFactory.somemethod("resources/fonts/somefont.ttf"); 

मैंने सोचा था वहाँ मानक Maven निर्देशिका संरचना के साथ एक परियोजना वर्ग/पैकेज से पूर्ण रिश्तेदार पथ का उपयोग किए बिना संसाधन फ़ोल्डर से एक फ़ाइल प्राप्त करने के लिए के साथ एक तरह से किया गया था। इस पर कोई सलाह बहुत सराहना की है।

मैं हार्ड-कोडेड पथ का उपयोग नहीं करना चाहता क्योंकि परियोजना पर काम करने वाले विभिन्न डेवलपर्स के पास अलग-अलग सेटअप हैं और मैं इसे परियोजना के हिस्से के रूप में शामिल करना चाहता हूं ताकि वे परियोजना स्रोत को चेकआउट करते समय सीधे प्राप्त कर सकें ।

यह एक वेब अनुप्रयोग (Struts 1.3 एप्लिकेशन) और के लिए है जब मैं (जो मैं परियोजना चला रहा हूँ के बंद बिलाव के माध्यम से) विस्फोट युद्ध फ़ाइल में देखो, फ़ाइल पर है:

<Exploded war dir>/resources/fonts/somefont.ttf 
+1

क्या ResourceBundle से फ़ाइल वस्तु हो रही है, तो File.getAbsolutePath उपयोग करने के साथ गलत क्या है() FontFactory.somemethod को पारित करने के लिए()? (ध्यान रखें कि यदि डब्ल्यूएआर परिनियोजन पर विस्तार नहीं किया गया है तो आपको फ़ाइल ऑब्जेक्ट प्राप्त करने की गारंटी नहीं है।) – BobG

+0

शायद इसके साथ कुछ भी गलत नहीं है :) धन्यवाद, मैं 'रिसोर्सबंडल' से परिचित नहीं हूं, इसलिए यह नहीं पता था कि यह काम करेगा, टिप – Rick

+0

के लिए धन्यवाद वास्तव में मुझे आपको कुछ छद्म कोड पोस्ट करने दें नीचे सफलता के साथ - संसाधन बंडल पर सुनिश्चित नहीं है, लेकिन संसाधन (वसंत से बाहर) काम करता है: – BobG

उत्तर

11

कोड :

import java.io.File; 
import org.springframework.core.io.*; 

public String getFontFilePath(String classpathRelativePath) { 
    Resource rsrc = new ClassPathResource(classpathRelativePath); 
    return rsrc.getFile().getAbsolutePath(); 
} 

आपके मामले में, classpathRelativePath की तरह "/resources/fonts/somefont.ttf" कुछ होगा।

+0

मैं वास्तव में इस विशेष परियोजना के लिए वसंत का उपयोग नहीं कर रहा हूं, शायद इसे छोड़ देना चाहिए वह खोजशब्द, मुझे कभी-कभी वसंत में ऐसा करने की ज़रूरत होती है, इसलिए मैं ऐसे तरीके की तलाश कर रहा था जो स्ट्रैट्स/वसंत – Rick

+0

दोनों में काम करेगा, कोड में छोटे सुधार: क्लासपाथ रिसोर्स आरएसआरसी = नया क्लासपाथ रिसोर्स (क्लासपाथरेलिएटपाथ); इस तरह आप विधि को कॉल कर सकते हैं .getFile() –

+0

@GoranNastov वर्तमान दस्तावेज़ 'संसाधन # getFile()' कॉल दिखाते हैं; क्या आप विस्तार से समझा सकते हैं? http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/io/Resource.html#getFile-- –

0

आप जो मैं था Loading XML Files during Maven Test run

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

1

यदि आपकी संसाधन निर्देशिका आपके युद्ध की जड़ में है, तो इसका अर्थ है कि संसाधन/फ़ॉन्ट/somefont.ttf एक "आभासी पथ" होगा जहां वह फ़ाइल उपलब्ध है। ServletContext से आप get the "real path" - पूर्ण फ़ाइल सिस्टम पथ - कर सकते हैं। नोट (दस्तावेज़ों में) कि यह केवल तभी काम करता है जब WAR विस्फोट हो। यदि आपका कंटेनर ऐप को युद्ध फ़ाइल से विस्तारित किए बिना चलाता है, तो यह विधि काम नहीं करेगी।

+0

हम इसे विस्फोट के रूप में चलाते हैं और मुझे नहीं लगता कि जल्द ही बदल रहा है, इसलिए यह काम करना चाहिए, टिप – Rick

3

आप फ़ाइल का रास्ता पाने के लिए नीचे वर्णित का उपयोग कर सकते हैं:

String fileName = "/filename.extension"; //use forward slash to recognize your file 
String path = this.getClass().getResource(fileName).toString(); 

उपयोग/अपने तरीकों के लिए पथ गुजरती हैं।

1
URL resource = getServletContext().getResource("/WEB-INF/classes/fonts/somefont.ttf"); 
String relativePath = resource.getPath(); 
+0

के लिए धन्यवाद अगर काम यूआरएल में प्रदर्शित नहीं किया जा सकता है और यूआरएल-एनकोडेड हो जाता है। –