Reputation: 9568
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
Reputation: 2367
If you are using some third party code this should work:
url.openConnection().setDefaultUseCaches(false);
Upvotes: 0
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
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
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
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