2016-04-09 4 views
1

Использование JarURLConnection Я могу прочитать файл (например, VERSION.TXT) из баночки , размещенный на Dropbox используя следующую структуру кода:Закрытие JarURLConnection

public static void checkForUpdates() { 
    JarURLConnection jarConn = null; 
    try { 

     System.out.println("Checking for updates.."); 

     URL updateURL = new URL("jar:https://www.dropbox.com/s/.../foo.jar?dl=1!/version.txt"); 
     jarConn = (JarURLConnection) updateURL.openConnection(); 
     JarFile jarFile = jarConn.getJarFile(); 
     InputStream inputStream = jarFile.getInputStream(jarConn.getJarEntry()); 
     BufferedReader versionTXT = new BufferedReader(new InputStreamReader(inputStream)); 

     /* Version comparing left out */ 

     // If there is an update: 
     System.out.println("Update found!"); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (jarConn != null) { 
      // This doesn't seem to work 
      jarConn.getInputStream().close(); 
     } 
    } 
} 

Она работает правильно, когда я вызовите этот метод в первый раз; вы можете увидеть задержку между сообщением «проверка обновлений» и сообщением «результат».

Когда я загрузить новую foo.jar на Dropbox, и запустить checkForUpdates() метод снова (без перезапуска виртуальной машины Java), он будет использовать «старый» банку, и нет никакой задержки между проверкой & сообщения результатов. Когда I do перезапустите JVM, он будет использовать «новую» банку и показать задержку между сообщениями.

Есть ли способ закрыть JarURLConnection, кроме закрытия InputStream (который, похоже, не работает)?

Я попытался следующие вещи:

  • Закрытие JarURLConnection в OutputStream -> Выдает ошибку о том, что соединение не имеет OutputStream.
  • Закрытие URLConnections INPUT- & OutputStream (создавая новую переменную, прежде чем я бросил его в JarURLConnection) -> Закрытие InputStream, кажется, не делать ничего, и закрывая OutputStream бросает ту же ошибку.
  • Закрытие BufferedReader -> Без эффекта.

Если это не представляется возможным, чтобы закрыть JarURLConnection, можно создать новую, ли воссоединиться? Перезапуск JVM, по-видимому, делает то, что он повторно соединяет, можно ли имитировать это без перезапуска JVM?

Заранее спасибо.

+0

вы можете сделать попытку - ресурс вместо? https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html – chrisl08

+0

Я только что протестировал ресурс try на моем InputStream и BufferedReader, но нет никакой разницы. – Semx11

ответ

2

JarURLConnection использует кеш для файлов jar. Поэтому вы не видите задержки во второй попытке.

Так просто отключить кэш, прежде чем открыть файл Jar:

JarURLConnection con = ...; 
con.setUseCaches(false); 
JarFile jarFile = jarConn.getJarFile(); 
+0

Большое вам спасибо! Я просто понял это, и я перезагрузил эту страницу, чтобы увидеть ваш ответ, который был только что опубликован. Очевидно, я соглашусь на это как на ответ. – Semx11

1

Это может ответить на ваш вопрос:

URLConnection cache prevents updating JARs with the JarArchiveRepository

Единственный способ решения проблемы я нашел, чтобы отключить JarURLConnection кеширования и работает тогда, как и ожидалось:

urlConnection.setDefaultUseCaches(false); 

Вы можете увидеть Sun code here:

public void connect() throws IOException { 
    if (!connected) { 
     /* the factory call will do the security checks */ 
     jarFile = factory.get(getJarFileURL(), getUseCaches()); 

     /* we also ask the factory the permission that was required 
     * to get the jarFile, and set it as our permission. 
     */ 
     if (getUseCaches()) { 
      jarFileURLConnection = factory.getConnection(jarFile); 
     } 

     if ((entryName != null)) { 
      jarEntry = (JarEntry)jarFile.getEntry(entryName); 
      if (jarEntry == null) { 
       try { 
        if (!getUseCaches()) { 
         jarFile.close(); 
        } 
       } catch (Exception e) { 
       } 
       throw new FileNotFoundException("JAR entry " + entryName + " not found in " + jarFile.getName()); 
      } 
     } 
     connected = true; 
    } 
} 
+0

Полезный ответ, спасибо! – Semx11

 Смежные вопросы

  • Нет связанных вопросов^_^