2012-07-19 91 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);