Guy Korland
Guy Korland

Reputation: 9568

java.net.URL cache when reading from files

It seems like java is holding some kind of a cache to URL (& files). e.g. 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.

Upvotes: 7

Views: 6333

Answers (5)

Mateusz Kaflowski
Mateusz Kaflowski

Reputation: 2367

If you are using some third party code this should work:

url.openConnection().setDefaultUseCaches(false);

Upvotes: 0

Isaac Leal
Isaac Leal

Reputation: 121

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

Upvotes: 5

sbridges
sbridges

Reputation: 25140

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();

Upvotes: 3

Yves Martin
Yves Martin

Reputation: 10361

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...

Upvotes: 8

Christian Kuetbach
Christian Kuetbach

Reputation: 16060

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();
}

Upvotes: 1

Related Questions