从文件中读取数据时的java.net.URL缓存(java.net.URL cache when r

2019-09-19 20:57发布

好像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上。

Answer 1:

由于的jar在你的URL中使用的协议,该连接的一个实例sun.net.www.protocol.jar.JarURLConnection这需要从实现缓存的好处sun.net.www.protocol.jar.JarFileFactory

源代码,证实了setUseCache(false)URLConnection实施将防止利用该缓存。

我对Linux / Windows的行为差异假说:从URLJarFileCloseController接口关闭事件触发通知在Windows上速度更快,因为它不升值,以保持文件句柄打开了太长时间......



Answer 2:

其实,答案很简单,非常接近通过sbridges给出了答案,但使用的URLConnection“新的URLConnection(......)”你不能实例化,因为它是一个抽象类。

你可以做这种方式:

    URL url = new URL(urlSrt);
    URLConnection con = url.openConnection();
    con.setUseCaches(false);


Answer 3:

您可以关闭缓存使用URL连接,

  URLConnection con = new URLConnection(new URL("jar", "", "file:test.jar!/resourcs.txt"));
  con.setUseCaches(false);
  new BufferedReader (new InputStreamReader(con.getInputStream())).readLine();


Answer 4:

我认为这是某种形式的类装载问题的,因为它是JAR-protocoll。

尝试打开你的罐子为ZIP文件来代替。

ZipFile zf = new ZipFile(file);
try {
  InputStream in = zf.getInputStream("resourcs.txt");
  // ... read from 'in' as normal
} finally {
  zf.close();
}


Answer 5:

如果您使用的是一些第三方的代码这应该工作:

url.openConnection().setDefaultUseCaches(false);


文章来源: java.net.URL cache when reading from files
标签: java file io