好像Java是抱着某种缓存到URL(文件)。 例如,我在我的类路径中的JAR文件的文件“resourcs.txt”。 这个文件的内容是:“1版”
new java.io.BufferedReader (new java.io.InputStreamReader( new URL("jar", "", "file:test.jar!/resourcs.txt").openConnection().getInputStream())).readLine()
返回“版本1”(如预期)
我更改文件内容是“第2版”,并再次打电话到该代码。 我仍然得到“第1版”
如何清除这个“缓存”。
注意:我发现它只发生在Linux上。
由于的jar
在你的URL中使用的协议,该连接的一个实例sun.net.www.protocol.jar.JarURLConnection这需要从实现缓存的好处sun.net.www.protocol.jar.JarFileFactory
源代码,证实了setUseCache(false)
上URLConnection
实施将防止利用该缓存。
我对Linux / Windows的行为差异假说:从URLJarFileCloseController接口关闭事件触发通知在Windows上速度更快,因为它不升值,以保持文件句柄打开了太长时间......
其实,答案很简单,非常接近通过sbridges给出了答案,但使用的URLConnection“新的URLConnection(......)”你不能实例化,因为它是一个抽象类。
你可以做这种方式:
URL url = new URL(urlSrt);
URLConnection con = url.openConnection();
con.setUseCaches(false);
您可以关闭缓存使用URL连接,
URLConnection con = new URLConnection(new URL("jar", "", "file:test.jar!/resourcs.txt"));
con.setUseCaches(false);
new BufferedReader (new InputStreamReader(con.getInputStream())).readLine();
我认为这是某种形式的类装载问题的,因为它是JAR-protocoll。
尝试打开你的罐子为ZIP文件来代替。
ZipFile zf = new ZipFile(file);
try {
InputStream in = zf.getInputStream("resourcs.txt");
// ... read from 'in' as normal
} finally {
zf.close();
}
如果您使用的是一些第三方的代码这应该工作:
url.openConnection().setDefaultUseCaches(false);