7

JavaがURL(&ファイル)へのある種のキャッシュを保持しているようです。たとえば、クラスパスのjarファイルに「resourcs.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 でのみ発生することがわかりました。

4

5 に答える 5

8

jarURL で使用されるプロトコルにより、接続は sun.net.www.protocol.jar.JarURLConnection のインスタンスになり、sun.net.www.protocol.jar.JarFileFactory実装されたキャッシュを利用します。

ソースコードは、setUseCache(false)オンURLConnection実装がそのキャッシュの使用を妨げることを確認しています。

Linux と Windows の動作の違いに関する私の仮説: URLJarFileCloseController インターフェイスからのクローズ イベント通知は、Windows ではファイル ハンドルを長時間開いたままにしておくことを好まないため、より高速にトリガーされます...

于 2012-07-29T14:00:22.767 に答える
3

次を使用して、URL 接続のキャッシュをオフにすることができます。

  URLConnection con = new URLConnection(new URL("jar", "", "file:test.jar!/resourcs.txt"));
  con.setUseCaches(false);
  new BufferedReader (new InputStreamReader(con.getInputStream())).readLine();
于 2012-07-29T04:45:29.727 に答える
1

これはjar-protocollであるため、ある種のクラス読み込みの問題だと思います。

代わりに、jarファイルをzipファイルとして開いてみてください。

ZipFile zf = new ZipFile(file);
try {
  InputStream in = zf.getInputStream("resourcs.txt");
  // ... read from 'in' as normal
} finally {
  zf.close();
}
于 2012-07-28T23:03:37.703 に答える