Как приложение может использовать файлы внутри JAR для чтения и записи?

#java #json #file #resources

#java #jar #входной поток #outputstream

Вопрос:

Мне нужно хранить данные в файлах внутри.файл jar и прочитайте его снова.

Я знаю, что могу использовать Class.getResourceAsStream() метод, но он возвращает InputStream значение, из которого я могу читать. Но я ищу способ записи.

Ответ №1:

Мне нужно хранить данные в файлах внутри.файл jar и прочитайте его снова

Нет, ты этого не делаешь.

Вместо этого сохраните файл «по умолчанию» внутри Jar. Если он изменен, сохраните измененный файл в другом месте. Одним из общих мест является подкаталог user.home . При проверке наличия файла сначала проверьте наличие измененного файла в файловой системе, и если он не существует, загрузите файл по умолчанию.


Обратите внимание, что обычно лучше описывать цель, а не стратегию. «Сохранить измененный файл в Jar» — это стратегия, тогда как «Сохранять настройки между запусками» может быть целью.

Связанный: В чем проблема XY?

Ответ №2:

На самом деле это не поддерживается. В принципе, вы можете работать с файлом jar, но нет гарантии, что новое содержимое будет правильно загружено. Позвольте вашим инструментам сборки управлять файлом jar — и выберите что-нибудь еще для постоянного хранилища, управляемого самой вашей программой. Как файл.

Ответ №3:

Маловероятно, что вы можете безопасно изменить загруженный jar. Изменять его во время использования — не очень хорошая идея.

Если вы хотите это сделать, используйте обычный каталог файловой системы и добавляйте / удаляйте файлы из него. Даже это может работать не так, как вы ожидаете.

Ответ №4:

Вы можете управлять любым файлом jar с помощью пакета java.util.jar (или даже просто java.util.zip ). Поскольку файлы внутри jar будут сжаты, это не самый эффективный по времени способ хранения данных.

Вероятно, вам следует использовать каталог где-нибудь в другом месте (например System.getProperty("user.home") "/.myProgram" ,) или посмотреть java.util.prefs .

Ответ №5:

Class.getResource() возвращает URL. Теоретически вы можете использовать этот URL для создания своего InputStream и OutputStream . Но в большинстве случаев созданный JAR-файл (или архив) доступен только для чтения. Таким образом, ваше приложение может сработать при попытке его использования.