Как приложение может использовать файлы внутри JAR для чтения и записи?
Мне нужно хранить данные в файлах внутри.jar файла и читать его снова.
Я знаю, что я могу использовать Class.getResourceAsStream()
метод, но он возвращает InputStream
что я могу читать. Но я ищу способ написать.
5 ответов
Мне нужно хранить данные в файлах внутри.jar файла и читать его снова
Нет, ты не
Вместо этого сохраните файл "по умолчанию" внутри Jar. Если он изменен, сохраните измененный файл в другом месте. Одно общее место - это подкаталог user.home
, При проверке файла сначала проверьте наличие измененного файла в файловой системе, и, если он не существует, загрузите файл по умолчанию.
Обратите внимание, что обычно лучше описать цель, чем стратегию. "Хранить измененный файл в Jar" - это стратегия, в то время как "Сохранить настройки между запусками" может быть целью.
Связанный: В чем проблема XY?
Вряд ли вы можете сменить загруженную банку безопасно. Менять его во время использования не очень хорошая идея.
Если вы хотите сделать это, используйте простой каталог файловой системы и добавляйте / удаляйте файлы из него. Даже это может не сработать, как вы ожидаете.
Это не очень поддерживается. В принципе, вы можете работать с файлом JAR, но нет гарантии, что новое содержимое будет загружено правильно. Позвольте вашим инструментам сборки управлять файлом JAR - и выберите что-то другое для постоянного хранения, которым управляет ваша программа. Как файл.
Вы можете манипулировать любым jar-файлом, используя пакет java.util.jar
(или просто java.util.zip
). Поскольку файлы внутри jar-файла будут сжаты, это не самый эффективный для вас способ хранения данных.
Вы, вероятно, должны использовать каталог где-то еще (например, System.getProperty("user.home") + "/.myProgram"
) или посмотреть java.util.prefs
,
Class.getResource()
возвращает URL. Теоретически, вы можете использовать этот URL для создания вашего InputStream
а также OutputStream
, Но в большинстве случаев сгенерированный JAR является файлом (или архивом) только для чтения. Таким образом, ваше приложение может отключиться при попытке его использования.