दिलचस्प पोस्ट
कैसे जांचने के लिए कि एक लाइन regex का उपयोग कर रिक्त है जावा में यूएस-एस्की के लिए UTF-8 को कैसे परिवर्तित करें माता-पिता की मौत के बाद बच्चे की प्रक्रिया कैसे शुरू हो जाती है? म्युचुअल सूचना और दो छवियों की संयुक्त एंट्रोपी – MATLAB मैं ज्येथोन में विभिन्न पायथन लाइब्रेरी कैसे स्थापित कर सकता हूं? ड्रॉप छाया केवल नीचे css3 Php जांचें कि स्ट्रिंग में चीनी वर्ण हैं 'सुरक्षित' और 'संरक्षित आंतरिक' के बीच अंतर क्या है? उत्तरदायी रूप से पक्ष आकार रखते हुए पहलू अनुपात क्या सी ++ में टाइपपेफ़ खोजशब्द के लिए एक जावा समतुल्य या पद्धति है? क्या मैं आराम के बारे में नहीं समझ रहा हूँ? रूपांतरण प्रकार – हस्ताक्षरित इंट / चार से हस्ताक्षरित उद्देश्य सी में एमडी 5 एल्गोरिदम कैसे एक नोड। Js आवेदन स्थायी रूप से चलाने के लिए? मैं एक स्टैक ट्रेस को स्ट्रिंग में कैसे रूपांतरित कर सकता / सकती हूं?

जावा JAR फ़ाइल में एक संसाधन के लिए पथ कैसे प्राप्त करें

मैं एक संसाधन के लिए पथ प्राप्त करने की कोशिश कर रहा हूं, लेकिन मुझे कोई भाग्य नहीं मिला है।

यह काम करता है (दोनों IDE में और JAR के साथ) लेकिन इस तरह से मुझे एक फ़ाइल का पथ नहीं मिल सकता है, केवल फ़ाइल सामग्री:

ClassLoader classLoader = getClass().getClassLoader(); PrintInputStream(classLoader.getResourceAsStream("config/netclient.p")); 

अगर मैं ऐसा करता हूं:

 ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("config/netclient.p").getFile()); 

परिणाम है: java.io.FileNotFoundException: file:/path/to/jarfile/bot.jar!/config/netclient.p (No such file or directory)

संसाधन फ़ाइल के लिए पथ प्राप्त करने का कोई तरीका है?

वेब के समाधान से एकत्रित समाधान "जावा JAR फ़ाइल में एक संसाधन के लिए पथ कैसे प्राप्त करें"

यह जानबूझकर है "फ़ाइल" की सामग्री फ़ाइल के रूप में उपलब्ध नहीं हो सकती है। याद रखें कि आप कक्षाओं और संसाधनों के साथ काम कर रहे हैं जो कि एक JAR फ़ाइल या अन्य प्रकार के संसाधन का हिस्सा हो सकता है। क्लासलोडर को संसाधन के लिए फ़ाइल हैंडल प्रदान करने की आवश्यकता नहीं है, उदाहरण के लिए फ़ाइल सिस्टम में जार फाइल अलग-अलग फाइलों में विस्तारित नहीं हो सकती है।

आप जो भी कर सकते हैं, एक java.io.file प्राप्त कर सकते हैं, स्ट्रीम को एक अस्थायी फ़ाइल में कॉपी करके वही कर सकते हैं, अगर कोई java.io.file बिल्कुल आवश्यक है

जब एक संसाधन लोड हो रहा है, तो सुनिश्चित करें कि आप के बीच के अंतर को नोटिस करते हैं:

 getClass().getClassLoader().getResource("com/myorg/foo.jpg") //relative path 

तथा

 getClass().getResource("/com/myorg/foo.jpg")); //note the slash at the beginning 

मुझे लगता है, यह भ्रम एक संसाधन लोड करते समय बहुत से समस्याएं पैदा कर रहा है जब आप कोई छवि लोड कर रहे हैं तो getResourceAsStream() का उपयोग करना आसान है:

 BufferedImage image = ImageIO.read(getClass().getResourceAsStream("/com/myorg/foo.jpg")); 

जब आप वास्तव में किसी जार संग्रह से (गैर-छवि) फ़ाइल लोड करना चाहते हैं, तो आप यह कोशिश कर सकते हैं:

  File file = null; String resource = "/com/myorg/foo.xml"; URL res = getClass().getResource(resource); if (res.toString().startsWith("jar:")) { try { InputStream input = getClass().getResourceAsStream(resource); file = File.createTempFile("tempfile", ".tmp"); OutputStream out = new FileOutputStream(file); int read; byte[] bytes = new byte[1024]; while ((read = input.read(bytes)) != -1) { out.write(bytes, 0, read); } file.deleteOnExit(); } catch (IOException ex) { Exceptions.printStackTrace(ex); } } else { //this will probably work in your IDE, but not from a JAR file = new File(res.getFile()); } if (file != null && !file.exists()) { throw new RuntimeException("Error: File " + file + " not found!"); } 

मैंने इस समस्या के साथ घूमते हुए कुछ समय बिताया, क्योंकि वास्तव में मैंने कोई हल नहीं पाया, अजीब तरह से काम किया! कार्य निर्देशिका अक्सर जार की निर्देशिका नहीं होती है, विशेषकर यदि किसी जार (या उस बात के लिए कोई प्रोग्राम) विंडोज के अंतर्गत प्रारंभ मेनू से चलाया जाता है तो यह है कि मैंने क्या किया, और यह जेएआर के बाहर से चलाए जा रहे वर्ग फ़ाइलों के लिए काम करता है, साथ ही यह एक जार के लिए काम करता है। (मैंने केवल विंडोज 7 के तहत इसका परीक्षण किया है।)

 try { //Attempt to get the path of the actual JAR file, because the working directory is frequently not where the file is. //Example: file:/D:/all/Java/TitanWaterworks/TitanWaterworks-en.jar!/TitanWaterworks.class //Another example: /D:/all/Java/TitanWaterworks/TitanWaterworks.class PROGRAM_DIRECTORY = getClass().getClassLoader().getResource("TitanWaterworks.class").getPath(); // Gets the path of the class or jar. //Find the last ! and cut it off at that location. If this isn't being run from a jar, there is no !, so it'll cause an exception, which is fine. try { PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(0, PROGRAM_DIRECTORY.lastIndexOf('!')); } catch (Exception e) { } //Find the last / and cut it off at that location. PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(0, PROGRAM_DIRECTORY.lastIndexOf('/') + 1); //If it starts with /, cut it off. if (PROGRAM_DIRECTORY.startsWith("/")) PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(1, PROGRAM_DIRECTORY.length()); //If it starts with file:/, cut that off, too. if (PROGRAM_DIRECTORY.startsWith("file:/")) PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(6, PROGRAM_DIRECTORY.length()); } catch (Exception e) { PROGRAM_DIRECTORY = ""; //Current working directory instead. } 

एक पंक्ति का उत्तर है –

 String path = this.getClass().getClassLoader().getResource(<resourceFileName>).toExternalForm() 

असल में getResource विधि URL देता है इस यूआरएल से आप पथ को निकालने के लिए toExternalForm() को कॉल कर सकते हैं

संदर्भ:

getResource () , toxternalForm ()

अगर netclient.p एक JAR फ़ाइल के अंदर है, तो इसका पथ नहीं होगा क्योंकि उस फ़ाइल को अन्य फाइल के अंदर स्थित है उस स्थिति में, आपके पास सबसे अच्छा पथ वास्तव में file:/path/to/jarfile/bot.jar!/config/netclient.p

आपको जार फ़ाइल के भीतर पथ को समझना होगा।
बस इसे रिश्तेदार को देखें। इसलिए यदि आपके पास एक फ़ाइल (myfile.txt) है, तो \\\\ \src\main\resources निर्देशिका निर्देशिका (मेवेन शैली) के तहत foo.jar में स्थित है। आप इसे इस तरह देखेंगे:

 src/main/resources/myfile.txt 

यदि आप jar -tvf myjar.jar का उपयोग कर अपने जार डंप करते हैं तो आप जार फ़ाइल के भीतर आउटपुट और सापेक्ष पथ देखेंगे, और फॉरवर्ड स्लैश का उपयोग करें।

फ़ाइल फाइल सिस्टम में फाइल के लिए एक अमूर्त है, और फाइल सिस्टम किसी जार की सामग्री के बारे में कुछ भी नहीं जानते हैं।

एक यूआरआई के साथ प्रयास करें, मुझे लगता है कि वहाँ एक जार है: // प्रोटोकॉल जो आपके पर्सपोउस के लिए उपयोगी हो सकता है

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

  File file = null; String resource = "/view/Trial_main.html" ; URL res = getClass().getResource(resource); if (res.toString().startsWith("jar:")) { try { InputStream input = getClass().getResourceAsStream(resource); file = File.createTempFile(new Date().getTime()+"", ".html"); OutputStream out = new FileOutputStream(file); int read; byte[] bytes = new byte[1024]; while ((read = input.read(bytes)) != -1) { out.write(bytes, 0, read); } out.flush(); out.close(); input.close(); file.deleteOnExit(); } catch (IOException ex) { ex.printStackTrace(); } } else { //this will probably work in your IDE, but not from a JAR file = new File(res.getFile()); } 

मेरे मामले में, मैंने इसके बजाय पथ को यूआरएल ऑब्जेक्ट का इस्तेमाल किया है।

फ़ाइल

 File file = new File("my_path"); URL url = file.toURI().toURL(); 

क्लासप्लर का उपयोग करके क्लासपाथ में संसाधन

 URL url = MyClass.class.getClassLoader().getResource("resource_name") 

जब मुझे सामग्री पढ़ने की आवश्यकता है, तो मैं निम्नलिखित कोड का उपयोग कर सकता हूं:

 InputStream stream = url.openStream(); 

और आप इनपुटस्ट्रीम का उपयोग करके सामग्री तक पहुंच सकते हैं

यह कहा गया है, संसाधनों को लोड करने का सबसे अच्छा तरीका नहीं है, लेकिन यदि आपके पास java.io.File संदर्भ होना चाहिए, तो निम्नलिखित का प्रयास करें:

  URL url = null; try { URL baseUrl = YourClass.class.getResource("."); if (baseUrl != null) { url = new URL(baseUrl, "yourfilename.ext"); } else { url = YourClass.class.getResource("yourfilename.ext"); } } catch (MalformedURLException e) { // Do something appropriate } 

यह आपको एक java.net.URL देता है और इसका उपयोग java.io.File कन्स्ट्रक्टर में किया जा सकता है।

निम्न पथ मेरे लिए काम किया है: classpath:/path/to/resource/in/jar

 private static final String FILE_LOCATION = "com/input/file/somefile.txt"; //Method Body InputStream invalidCharacterInputStream = URLClassLoader.getSystemResourceAsStream(FILE_LOCATION); 

getSystemResourceAsStream इसे प्राप्त करना सबसे अच्छा विकल्प है फ़ाइल या यूआरएल के बजाय इनपुटस्ट्रीम प्राप्त करने से, एक जेआर फ़ाइल में काम करता है और अकेले खड़े होकर।

जब एक जार फ़ाइल में, संसाधन पैकेज पदानुक्रम (फ़ाइल सिस्टम पदानुक्रम नहीं) में बिल्कुल स्थित होता है। इसलिए यदि आपके पास क्लास com.example है। "./default.conf" नामक एक संसाधन लोड हो रहा है, तो संसाधन का नाम "/com/example/default.conf" के रूप में निर्दिष्ट है।

लेकिन अगर यह एक जार में है तो यह एक फ़ाइल नहीं है …

अपने जार के अपने रिससॉर्स फ़ोल्डर (जावा / मुख्य / संसाधन) के अंदर अपनी फ़ाइल (हम मानते हैं कि आपने एक्सएमएल नामित एक एक्सएमएल फ़ाइल जोड़ लिया है ), इसके बाद आप रिसोर्सएललोड को इंजेक्ट करते हैं यदि आप स्प्रिंग की तरह बिल्ला करते हैं

 @Autowired private ResourceLoader resourceLoader; 

भ्रमण कोड लिखने के लिए फ़ाइल लोड करने के लिए:

  Resource resource = resourceLoader.getResource("classpath:imports.xml"); try{ File file; file = resource.getFile();//will load the file ... }catch(IOException e){e.printStackTrace();}