В настоящее время я работаю над программой для составления сидячих диаграмм для класса моего учителя. Я поместил все файлы данных в банку. Они считываются и заносятся в таблицу. После запуска основной функции программы она обновляет файлы, чтобы они соответствовали значениям таблиц. Я знаю, что мне нужно взорвать банку, а затем перезагрузить ее во время выполнения, чтобы редактировать файлы, но я не могу найти объяснения того, как перезагружать во время выполнения. У кого-нибудь есть идеи?
Саморазрывающийся и перезагружаемый файл jar во время выполнения
Ответы (2)
Краткий ответ:
Поместите файлы данных вне двоичного файла и отправьте вместе с JAR в отдельную папку.
Длинный:
Похоже, вы подходите к проблеме не с той стороны. Файл JAR представляет собой что-то вроде исполняемого файла (.exe
) на платформе Windows — двоичный файл только для чтения, содержащий код.
Вы можете (хотя это плохая практика) поместить некоторые ресурсы, такие как файлы данных, мультимедиа и т. д., внутрь JAR (как вы можете внутри .exe
). Но лучшим решением было бы разместить эти ресурсы вне бинарного файла, чтобы вы могли переключать их без перекомпиляции/пересборки.
Если вам нужно изменять ресурсы «на лету» во время работы приложения, у вас практически нет выбора. Файлы данных должны находиться вне двоичного файла. Опять же, вы никогда не увидите, как файл Windows .exe
изменяет себя во время работы.
.jar
файлы в любом случае никоим образом не защищены
- person Samuel Harmer; 04.01.2012
Томаш прав, что это плохая практика, но это возможно.
Содержимое пути к классам считывается в память во время начальной загрузки, однако файлы можно изменить, но их изменения не будут отражены после инициализации. Я бы рекомендовал поместить данные в другой файл, отдельно от ваших файлов классов, но если вы настаиваете на том, чтобы хранить их вместе, вы можете посмотреть:
- JarInputStream или ZipInputStream для чтения содержимого файла JAR.
- Получите JarEntry для соответствующего файла
- Прочитайте и измените содержимое по своему желанию
- JarOutputStream или ZipOutputStream для обратной записи содержимого
Убедитесь, что вы не читаете ресурс через путь к классам и что он поступает из файла на диске/в сети.