Как приложение может использовать файлы в 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 является файлом, доступным только для чтения (или архивом). Таким образом, ваше приложение может отключиться при попытке его использования.