7

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

4

5 回答 5

8

由于jarURL 中使用的协议,连接是sun.net.www.protocol.jar.JarURLConnection的一个实例,它受益于sun.net.www.protocol.jar.JarFileFactory中实现的缓存

源代码确认setUseCache(false)onURLConnection实现将阻止使用该缓存。

我关于 Linux/Windows 行为差异的假设:来自 URLJarFileCloseController 接口的关闭事件通知在 Windows 上触发得更快,因为它不喜欢让文件句柄保持打开太长时间......

于 2012-07-29T14:00:22.767 回答
5

其实简单的答案真的很接近sbridges给出的答案,但是不能用“new URLConnection(...)”来实例化URLConnection,因为它是一个抽象类。

你可以这样做:

    URL url = new URL(urlSrt);
    URLConnection con = url.openConnection();
    con.setUseCaches(false);
于 2014-01-21T16:09:55.760 回答
3

您可以使用以下方法关闭 url 连接的缓存,

  URLConnection con = new URLConnection(new URL("jar", "", "file:test.jar!/resourcs.txt"));
  con.setUseCaches(false);
  new BufferedReader (new InputStreamReader(con.getInputStream())).readLine();
于 2012-07-29T04:45:29.727 回答
1

我认为这是某种类加载问题,因为它是 jar-protocoll。

尝试以 zip 文件的形式打开您的 jar。

ZipFile zf = new ZipFile(file);
try {
  InputStream in = zf.getInputStream("resourcs.txt");
  // ... read from 'in' as normal
} finally {
  zf.close();
}
于 2012-07-28T23:03:37.703 回答
0

如果您使用一些第三方代码,这应该可以工作:

url.openConnection().setDefaultUseCaches(false);
于 2018-01-25T16:40:16.063 回答