Самораспаковывающийся и изменяющий файл JAR во время выполнения - PullRequest
4 голосов
/ 04 января 2012

В настоящее время я работаю над программой создания сидячих диаграмм для классной комнаты моего учителя.Я положил все файлы данных в банку.Они читаются и ставятся на стол.После запуска основной функции программы, она обновляет файлы, чтобы соответствовать значениям таблиц.Я знаю, что мне нужно взорвать банку, а затем заново установить ее во время выполнения, чтобы отредактировать файлы, но я не могу найти объяснения о том, как перенастроить во время выполнения процедуры.У кого-нибудь есть идеи?

Ответы [ 2 ]

4 голосов
/ 04 января 2012

Краткий ответ:

Поместите файлы данных вне двоичного файла и отправьте вместе с JAR в отдельную папку.

Длинный:

Похоже, вы приближаетесьпроблема с неправильного направления.Файл JAR является чем-то вроде исполняемого файла (.exe) на платформе Windows - двоичный файл только для чтения, содержащий код .

Вы можете (хотя это плохая практика) поместите некоторые ресурсы, такие как файлы данных, мультимедиа и т. д. внутри JAR (как вы можете внутри .exe).Но лучшим решением было бы разместить эти ресурсы вне двоичного файла, чтобы вы могли переключать их без перекомпиляции / перекомпоновки.

Если вам нужно изменить ресурсы на лету во время работы приложения, вы в основномУ меня нет выбора.Файлы данных должны быть вне двоичного файла.Еще раз, вы никогда не увидите файл Windows .exe, модифицирующий себя во время работы.

2 голосов
/ 04 января 2012

Томаш прав, что следующее - плохая практика, но это возможно.

Содержимое пути к классам читается в память во время начальной загрузки, однако файлы могут быть изменены, но их изменения не будут отражены после инициализации. Я бы порекомендовал поместить данные в другой файл, отдельный от ваших файлов классов, но если вы настаиваете на их сохранении, вы можете посмотреть:

  • JarInputStream или ZipInputStream для чтения содержимого файла JAR
  • Получить JarEntry для соответствующего файла
  • Читайте и изменяйте содержимое по своему желанию
  • JarOutputStream или ZipOutputStream для записи содержимого обратно

Убедитесь, что вы не читаете ресурс через classpath и что он исходит из файла на диске / в сети.

...