从文件读取时java.net.URL缓存

时间:2012-07-19 21:22:05

标签: java file io

似乎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上。

5 个答案:

答案 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);