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