简体   繁体   中英

java.net.URL cache when reading from files

It seems like java is holding some kind of a cache to URL (& files). eg I have a file "resourcs.txt" in a jar file in my classpath. The content of this file is: "Version 1"

new java.io.BufferedReader (new java.io.InputStreamReader( new URL("jar", "", "file:test.jar!/resourcs.txt").openConnection().getInputStream())).readLine()

returns "Version 1" (as expected)

I change the file content to be "Version 2" and call again to this code. And I still get "Version 1"

How can I clear this "cache".

Notice: I found out it only happens on Linux.

Because of the jar protocol used in your URL, the connection is an instance of sun.net.www.protocol.jar.JarURLConnection which takes benefit from a cache implemented in sun.net.www.protocol.jar.JarFileFactory

Source code confirms a setUseCache(false) on URLConnection implementation will prevent the use of that cache.

My hypothesis about the Linux/Windows behavior difference: the close event notification from URLJarFileCloseController interface is triggered faster on Windows because it does not appreciate to keep file handles opened for a too long period...

Actually, the simple answer is really close to the answer given by sbridges, but you can't instantiate URLConnection using "new URLConnection(...)", because it's a abstract class.

You can just do this way:

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

You can turn off caching for a url connection using,

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

I think this is some kind of class-loading problem, because it is the jar-protocoll.

Try to open your jar as a zip-file instead.

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

如果您使用某些第三方代码,这应该有效:

url.openConnection().setDefaultUseCaches(false);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM