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.