从文件读取时的java.net.URL缓存

从文件读取时的java.net.URL缓存,java,file,io,Java,File,Io,看起来java正在保存某种URL(文件)的缓存。 例如 我的类路径中的jar文件中有一个文件“resourcs.txt”。 此文件的内容是: “第1版” 返回“版本1”(如预期) 我将文件内容更改为“Version2”,并再次调用此代码。 而我仍然得到“版本1” 如何清除此“缓存” 注意:我发现它只发生在Linux上。我认为这是某种类加载问题,因为它是jar协议 尝试将jar作为zip文件打开 ZipFile zf = new ZipFile(file); try { InputStream

看起来java正在保存某种URL(文件)的缓存。 例如 我的类路径中的jar文件中有一个文件“resourcs.txt”。 此文件的内容是: “第1版”

返回“版本1”(如预期)

我将文件内容更改为“Version2”,并再次调用此代码。 而我仍然得到“版本1”

如何清除此“缓存”


注意:我发现它只发生在Linux上。

我认为这是某种类加载问题,因为它是jar协议

尝试将jar作为zip文件打开

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

您可以使用关闭url连接的缓存

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

由于URL中使用了
jar
协议,因此该连接是一个实例,它从中实现的缓存中获益

源代码确认
URLConnection
上的
setUseCache(false)
实现将阻止使用该缓存


我对Linux/Windows行为差异的假设是:在Windows上,URLJarFileCloseController接口的关闭事件通知触发得更快,因为它不喜欢将文件句柄打开太长时间…

实际上,简单的答案与sbridges给出的答案非常接近,但是 不能使用“new URLConnection(…)”实例化URLConnection,因为它是一个抽象类

您可以这样做:

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

如果您使用的是某些第三方代码,则应该可以:

url.openConnection().setDefaultUseCaches(false);

我打赌这与它是一个.jar文件这一事实比使用URL更相关。我不确定,它只发生在LinuxInterest上。第一个流是否正确关闭?在Java程序运行时是否交换jar文件?很好,谢谢。我认为java中的资源缓存是一个危险的特性,不是每个人都知道的。我尝试从url刷新网络摄像头图像,但总是得到相同的图像。我正在尝试,本以为可以,但没有成功。我很困惑。在我的例子中,它不是一个JAR url,它还使用了
BufferedReader
url.openConnection().setDefaultUseCaches(false);