java.net.URL缓存从文件中读取时
看起来像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上。
因为在你的URL中使用的jar
协议,连接这需要从实现缓存利益sun.net.www.protocol.jar.JarURLConnection实例sun.net.www.protocol.jar.JarFileFactory
源代码在URLConnection
上确认setUseCache(false)
实现将阻止使用该缓存。
我对Linux/Windows的行为差异假说:从URLJarFileCloseController接口关闭事件通知被触发速度更快的Windows,因为它不升值,以保持文件句柄打开了太长时间......
我认为这是某种类加载问题,因为它是jar-protocoll。
尝试打开你的jar而不是zip文件。
ZipFile zf = new ZipFile(file);
try {
InputStream in = zf.getInputStream("resourcs.txt");
// ... read from 'in' as normal
} finally {
zf.close();
}
您可以关闭缓存使用URL连接,
URLConnection con = new URLConnection(new URL("jar", "", "file:test.jar!/resourcs.txt"));
con.setUseCaches(false);
new BufferedReader (new InputStreamReader(con.getInputStream())).readLine();
其实,简单的答案与sbridges给出的答案非常接近,但是不能使用“new URLConnection(...)”实例化URLConnection,因为它是一个抽象类。
你可以这样做是这样的:如果你使用的是一些第三方的代码
URL url = new URL(urlSrt);
URLConnection con = url.openConnection();
con.setUseCaches(false);
太好了,谢谢。我认为java中的资源缓存是一个不是每个人都知道的危险功能。我试图从网址刷新网络摄像头图像,但总是得到相同的图像。 – Stephan 2015-07-09 06:59:26
这应该工作:
url.openConnection().setDefaultUseCaches(false);
我敢打赌,这是更相关的事实,这是一个.jar文件比使用URL – SJuan76 2012-07-19 21:25:31
我不确定,它只发生在Linux – 2012-07-19 21:38:27
有趣。第一流是否正确关闭? – esej 2012-07-19 21:40:20