2009-10-12 16 views
7

एक जेएआर के भीतर स्थित फाइल का संदर्भ देने के लिए Desktop.open(File f) के लिए संभव है?जावा डेस्कटॉप.ऑपेन (फ़ाइल एफ) संदर्भ फ़ाइल जेएआर के भीतर?

मैंने ClassLoader.getResource(String s) का उपयोग करने की कोशिश की, इसे एक यूआरआई में परिवर्तित कर दिया, फिर उससे एक फाइल बनाई। लेकिन इसके परिणामस्वरूप IllegalArgumentException: URI is not hierarchical है। बहुत ही सुंदर नहीं -

URL url = ClassLoader.getSystemClassLoader().getResource(...); 
System.out.println("url=" + url); // url is valid 
Desktop.getDesktop().open(new File(url.toURI())); 

एक संभावना the answer at JavaRanch जार में रिसोर्स नाम से एक अस्थायी फ़ाइल बनाने के लिए है जो है।

यह विंडोज एक्सपी पर चल रहा है।

+1

वास्तव में एक अस्थायी फ़ाइल का निर्माण एक अच्छा कामकाज है। इसके लिए आप एक "सुरुचिपूर्ण" लाइब्रेरी बना सकते हैं, इसलिए आपको हर बार इसे कोड करने की आवश्यकता नहीं है। – OscarRyz

उत्तर

6

.jar फ़ाइलों के अंदर "फ़ाइलें" ऑपरेटिंग सिस्टम में फ़ाइलें नहीं हैं। वे .jar फ़ाइल के कुछ क्षेत्र हैं और आमतौर पर संपीड़ित होते हैं। वे ओएस द्वारा अलग फाइलों के रूप में संबोधित नहीं हैं और इसलिए इस तरह प्रदर्शित नहीं किया जा सकता है।

जावा के पास कुछ यूआरआई द्वारा उन फ़ाइलों का जिक्र करने का एक साफ तरीका है (जैसा कि आपने getResource() का उपयोग करके महसूस किया है) लेकिन यह पूरी तरह जावा-विशिष्ट है।

आपको लगता है कि फ़ाइल का उपयोग करने के लिए कुछ बाहरी अनुप्रयोग चाहते हैं, आप मिल गया है दो संभव समाधान:

  1. फ़ाइल या
  2. तक पहुंच सकता है फ़ाइलें हैं कि पता करने के लिए सक्षम बनाने के कुछ मानकीकृत तरीका प्रदान करें एक .jar (या .zip) फ़ाइल में पैक किया गया।

आमतौर पर 2 वास्तव में एक विकल्प नहीं है (जब तक अन्य एप्लिकेशन जावा में भी लिखा नहीं जाता है, इस मामले में यह आसान है)।

विकल्प 1 आमतौर पर एक अस्थायी फ़ाइल को लिखकर और इसका जिक्र करते हुए किया जाता है। वैकल्पिक रूप से आप एक छोटा वेब सर्वर शुरू कर सकते हैं और कुछ यूआरएल के माध्यम से फ़ाइल प्रदान कर सकते हैं।

+0

मेरे पास वास्तव में एप्लिकेशन में एम्बेडेड एक वेब सर्वर (जेट्टी) है। फिर समस्या डेस्कटॉप है। ब्राउज (यूआरआई) केवल एक ब्राउज़र लॉन्च करेगा, न कि एक आवेदन। –

+1

@ क्यूओ: हाँ, मुझे एहसास हुआ कि आपने अपना संपादन जोड़ने के बाद खुले() के बारे में पूछा था। बेशक खुले() केवल temp फ़ाइल समाधान उपयोगी है। –

3

एक जार फ़ाइल के भीतर एक संसाधन बस फ़ाइल नहीं है - इसलिए आप इसे प्राप्त करने के लिए File का उपयोग नहीं कर सकते। यदि आप किसी ऐसी चीज का उपयोग कर रहे हैं जिसे वास्तव में एक फ़ाइल की आवश्यकता है, तो आपको वास्तव में एक अस्थायी फ़ाइल बनाना होगा और इसके बजाय इसे खोलना होगा।

1

लेकिन एक जेएआर फ़ाइल में एक प्रविष्टि File नहीं है! जेएआर फाइल एक फाइल है; इसकी प्रविष्टियां जार-फ़ाइल प्रविष्टियां हैं (स्पष्ट स्थिति के लिए)।

जावा में अवशोषण शामिल हैं जिसका अर्थ है कि आपको File एस के साथ काम करने की आवश्यकता नहीं है - इनपुट को समाहित करने के लिए Reader या InputStream का उपयोग क्यों न करें?

0

नहीं, यह है क्योंकि के रूप में आप सिर्फ गवाह आप लेख से पहले स्थान पर

में एक मान्य फ़ाइल नहीं है, नहीं है: Using the Desktop API in Java SE 6 हम

खुली है: एक का प्रतिनिधित्व करता है एक विशिष्ट फ़ाइल प्रकार

खोलने के साथ जुड़े किसी एप्लिकेशन द्वारा निष्पादित खुली कार्रवाई, तो आपको एक वैध होना होगा फ़ाइल और उसके बाद उस फ़ाइल से जुड़ा एक एप्लीकेशन है ताकि ओएस इसे खोल सके।जबकि ऐसा ऐप मौजूद हो सकता है, आपको अभी भी इसे अपनी फ़ाइल के यूआरएल को समझना होगा।

संबंधित मुद्दे