似乎java正在为URL(& files)保留某种缓存。 例如 我有一个文件" resourcs.txt"在我的类路径中的jar文件中。 该文件的内容是: "版本1"
new java.io.BufferedReader (new java.io.InputStreamReader( new URL("jar", "", "file:test.jar!/resourcs.txt").openConnection().getInputStream())).readLine()
返回"版本1" (正如预期的那样)
我将文件内容更改为"版本2"并再次调用此代码。 我仍然得到"版本1"
如何清除此"缓存"。
注意:我发现它只发生在Linux上。
答案 0 :(得分:6)
由于您的网址中使用了jar
协议,该连接是sun.net.www.protocol.jar.JarURLConnection的一个实例,可以从sun.net.www.protocol.jar.JarFileFactory
源代码确认setUseCache(false)
实施URLConnection
将阻止使用该缓存。
我关于Linux / Windows行为差异的假设:来自URLJarFileCloseController接口的关闭事件通知在Windows上被更快地触发,因为它不喜欢保持文件句柄打开太长时间......
答案 1 :(得分:4)
实际上,简单的答案非常接近sbridges给出的答案,但是 你无法使用“new URLConnection(...)”实例化URLConnection,因为它是一个抽象类。
你可以这样做:
URL url = new URL(urlSrt);
URLConnection con = url.openConnection();
con.setUseCaches(false);
答案 2 :(得分:3)
您可以使用
关闭网址连接的缓存 URLConnection con = new URLConnection(new URL("jar", "", "file:test.jar!/resourcs.txt"));
con.setUseCaches(false);
new BufferedReader (new InputStreamReader(con.getInputStream())).readLine();
答案 3 :(得分: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();
}
答案 4 :(得分:0)
如果您使用的是某些第三方代码,则应该有效:
url.openConnection().setDefaultUseCaches(false);