2012-07-19 9 views
5

ऐसा लगता है जैसे जावा यूआरएल (फाइलों) में किसी प्रकार का कैश रख रहा है। उदा। मेरे पास मेरे क्लासपाथ में एक जार फ़ाइल में "resourcs.txt" फ़ाइल है। इस फ़ाइल की सामग्री है: "संस्करण 1"java.net.URL कैश फाइलों से पढ़ने पर

new java.io.BufferedReader (new java.io.InputStreamReader(new URL("jar", "", "file:test.jar!/resourcs.txt").openConnection().getInputStream())).readLine() 

रिटर्न "संस्करण 1" (उम्मीद के रूप में)

मैं फ़ाइल सामग्री को बदलने "संस्करण 2" होने के लिए और इस कोड को फिर से फोन । और मुझे अभी भी "संस्करण 1"

मैं इस "कैश" को कैसे साफ़ कर सकता हूं।

नोटिस: मुझे पता चला कि यह केवल लिनक्स पर होता है।

+1

मुझे यकीन है कि यह सच है कि यह एक है से अधिक संबंधित है URL – SJuan76

+0

का उपयोग करने से .jar फ़ाइल मुझे यकीन नहीं है, यह केवल लिनक्स –

+1

पर दिलचस्प होता है। क्या पहली धाराएं ठीक से बंद हैं? – esej

उत्तर

6
अपने URL में प्रयोग किया जाता jar प्रोटोकॉल की वजह से

, कनेक्शन जो एक कैश में लागू से लाभ लेता है sun.net.www.protocol.jar.JarURLConnection का एक उदाहरण है sun.net.www.protocol.jar.JarFileFactory

स्रोत कोड setUseCache(false) पर URLConnection कार्यान्वयन की पुष्टि करता है जो उस कैश के उपयोग को रोक देगा।

लिनक्स/विंडोज व्यवहार अंतर के बारे में मेरे परिकल्पना: URLJarFileCloseController इंटरफ़ेस से करीब घटना अधिसूचना विंडोज पर तेजी से शुरू हो रहा है, क्योंकि यह फ़ाइल एक भी लंबी अवधि के लिए खोला हैंडल रखने के लिए सराहना नहीं करता है ...

1

मुझे लगता है कि यह किसी प्रकार की क्लास लोडिंग समस्या है, क्योंकि यह जार-प्रोटोकॉल है।

इसके बजाय अपने जार को ज़िप-फ़ाइल के रूप में खोलने का प्रयास करें।

ZipFile zf = new ZipFile(file); 
try { 
    InputStream in = zf.getInputStream("resourcs.txt"); 
    // ... read from 'in' as normal 
} finally { 
    zf.close(); 
} 
3

आप का उपयोग कर एक यूआरएल कनेक्शन के लिए कैशिंग बंद कर सकते हैं,

URLConnection con = new URLConnection(new URL("jar", "", "file:test.jar!/resourcs.txt")); 
    con.setUseCaches(false); 
    new BufferedReader (new InputStreamReader(con.getInputStream())).readLine(); 
3

वास्तव में, सरल उत्तर वास्तव में sbridges द्वारा दिए गए उत्तर के करीब है, लेकिन आप "नया URL कनेक्शन (...)" का उपयोग करके URLConnection को तुरंत चालू नहीं कर सकते हैं, क्योंकि यह एक सार वर्ग है।

तुम सिर्फ इस तरह से कर सकते हैं:

URL url = new URL(urlSrt); 
    URLConnection con = url.openConnection(); 
    con.setUseCaches(false); 
+0

ग्रेट, धन्यवाद। मुझे लगता है कि जावा में संसाधन कैशिंग एक खतरनाक विशेषता है जिसे हर कोई नहीं जानता है। मैंने एक यूआरएल से वेबकैम छवियों को ताज़ा करने की कोशिश की लेकिन हमेशा एक ही छवि मिल गई। – Stephan

0

आप किसी तीसरे पक्ष कोड का उपयोग कर रहे हैं, तो यह काम करना चाहिए:

url.openConnection().setDefaultUseCaches(false); 
संबंधित मुद्दे