【问题标题】:java.net.URL cache when reading from files从文件读取时的 java.net.URL 缓存
【发布时间】:2012-07-19 21:22:04
【问题描述】:

似乎 java 对 URL(和文件)持有某种缓存。 例如 我的类路径中的 jar 文件中有一个文件“resourcecs.txt”。 这个文件的内容是: “版本 1”

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

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

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

如何清除这个“缓存”。

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

【问题讨论】:

  • 我敢打赌,它是一个 .jar 文件,而不是使用 URL
  • 我不确定,它只发生在 Linux 上
  • 有趣。第一个流是否正确关闭?
  • 您是否在 Java 程序运行时交换 jar 文件?

标签: java file io


【解决方案1】:

由于您的 URL 中使用了jar 协议,连接是sun.net.www.protocol.jar.JarURLConnection 的一个实例,它受益于sun.net.www.protocol.jar.JarFileFactory 中实现的缓存

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

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

【讨论】:

    【解决方案2】:

    其实简单的答案确实和sbridges给出的答案很接近,但是 您不能使用“new URLConnection(...)”来实例化 URLConnection,因为它是一个抽象类。

    你可以这样做:

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

    【讨论】:

    • 太好了,谢谢。我认为java中的资源缓存是一个不是每个人都知道的危险特性。我尝试从 url 刷新网络摄像头图像,但总是得到相同的图像。
    • 我正在尝试这个,认为它会工作但没有成功。我很困惑。就我而言,它不是 JAR url,它也使用 BufferedReader
    【解决方案3】:

    您可以使用以下方法关闭 url 连接的缓存,

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

    【讨论】:

      【解决方案4】:

      我认为这是某种类加载问题,因为它是 jar-protocoll。

      尝试以 zip 文件的形式打开您的 jar。

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

      【讨论】:

        【解决方案5】:

        如果您使用一些第三方代码,这应该可以工作:

        url.openConnection().setDefaultUseCaches(false);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-15
          • 1970-01-01
          • 2023-03-29
          • 2017-04-07
          • 2017-02-17
          • 2011-01-18
          • 1970-01-01
          • 2011-09-02
          相关资源
          最近更新 更多