2012-07-19 54 views
5

看起來像java正在持有某種緩存到URL(&文件)。 例如 我在我的類路徑中的jar文件中有一個「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」

我該如何清除這個「緩存」。

注意:我發現它只發生在Linux上。

+1

我敢打賭,這是更相關的事實,這是一個.jar文件比使用URL – SJuan76 2012-07-19 21:25:31

+0

我不確定,它只發生在Linux – 2012-07-19 21:38:27

+1

有趣。第一流是否正確關閉? – esej 2012-07-19 21:40:20

回答

6

因爲在你的URL中使用的jar協議,連接這需要從實現緩存利益sun.net.www.protocol.jar.JarURLConnection實例sun.net.www.protocol.jar.JarFileFactory

源代碼在URLConnection上確認setUseCache(false)實現將阻止使用該緩存。

我對Linux/Windows的行爲差異假說:從URLJarFileCloseController接口關閉事件通知被觸發速度更快的Windows,因爲它不升值,以保持文件句柄打開了太長時間......

1

我認爲這是某種類加載問題,因爲它是jar-protocoll。

嘗試打開你的jar而不是zip文件。

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

您可以關閉緩存使用URL連接,

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

其實,簡單的答案與sbridges給出的答案非常接近,但是不能使用「new URLConnection(...)」實例化URLConnection,因爲它是一個抽象類。

你可以這樣做是這樣的:如果你使用的是一些第三方的代碼

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

太好了,謝謝。我認爲java中的資源緩存是一個不是每個人都知道的危險功能。我試圖從網址刷新網絡攝像頭圖像,但總是得到相同的圖像。 – Stephan 2015-07-09 06:59:26

0

這應該工作:

url.openConnection().setDefaultUseCaches(false);