Как моя программа на Java может хранить файлы внутри своего файла .jar? - PullRequest
13 голосов
/ 30 октября 2010

Я знаю, что файлы .jar являются в основном архивами, а также приложениями.Я спрашиваю, как я могу хранить данные (реальные файлы, а не только строки), упакованные внутри моей программы?Я хочу сделать это в своем Java-коде.

Причина этого, если вам интересно, что я создаю серверный мод игры.Сервер запускается и создает все данные уровня, и я хочу сохранить все эти файлы в моем приложении .jar.

Ответы [ 6 ]

20 голосов
/ 30 октября 2010

Да, вы можете сделать это.

Доступ к некодовым ресурсам в файле JAR на пути к классам можно получить с помощью Class.getResourceAsStream(String).Приложения обычно делают это, например, для встраивания интернационализированных сообщений в пакеты ресурсов.

Чтобы получить файл в файл JAR, просто скопируйте его в соответствующее место в дереве входного каталога, прежде чем запускать jarкоманда.

СЛЕДОВАТЬ ВВЕРХ

Теоретически ваше приложение может сохранять файлы в своем собственном JAR-файле при определенных обстоятельствах:

  • JAR должен быть файлом в локальной файловой системе;т.е. не JAR, который был выбран с удаленного сервера.
  • Приложение должно иметь доступ на запись к файлу JAR и его родительскому каталогу.
  • Приложению не нужно считывать файл обратно.он написал в JAR в текущем загрузчике классов;т.е. без выхода и перезапуска.
  • JAR не должен быть подписан.

Процедура будет такой:

  1. Найдите файл JAR иоткрыть как читатель архива ZIP.
  2. Создать программу записи архива ZIP для записи новой версии файла JAR.
  3. Записать файлы приложения в программу записи.
  4. Записать все ресурсыот читателя ZIP до устройства записи, исключая старые версии файлов приложений.
  5. Закройте устройство чтения и записи.
  6. Переименуйте новую версию JAR, чтобы заменить старую.

Последний шаг может не сработать, если исходный JAR-файл заблокирован JVM / OS.В этом случае вам необходимо выполнить переименование в скрипте-оболочке.

Однако я думаю, что большинство людей согласятся, что это ПЛОХАЯ ИДЕЯ.Проще и надежнее просто писать обычные файлы.

4 голосов
/ 30 октября 2010

Другие ответы предоставили несколько хороших стратегий, но я собираюсь предложить пойти в несколько ином направлении.

Эта игра предположительно имеет графику и является настольным приложением.Проще всего распространять настольные приложения с веб-сервера.

Если обе эти вещи верны для вашей игры, то рассмотрите возможность использования Java Web Start для ее развертывания.

JWS предлагает API, недоступные для других приложений.Одним из особых вопросов, вызывающих эту проблему, является сервис PersistenceService.PersistenceService позволяет небольшому количеству данных быть сохраненными и восстановленными приложением.(даже когда он в песочнице).Я сделал небольшую демонстрацию .of PersistenceService .

Идея состоит в том, чтобы проверить PersistenceService на наличие данных приложения и, если они не найдены, использовать данные в Jar-файлах.Если пользователь / приложение изменяет данные, запишите измененные данные в PersistenceService.


JWS также предлагает другие полезные функции, такие как заставки, интеграция с рабочим столом, автоматические обновления.

1 голос
/ 19 сентября 2013

Путем создания файла в исходных пакетах (например: /src/resource/file.txt) его содержимое можно прочитать с помощью Class.getResourceAsStream(String)

Это рабочая реализация следующего ответа

    InputStream is = Class.class.getResourceAsStream("/resource/file.txt");        
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    StringBuilder sb = new StringBuilder();
    String line;
    while((line = br.readLine()) != null) {
        sb.append(line).append("\n");
    }
    System.out.println(sb.toString());
1 голос
/ 31 октября 2010

Не делай этого.Файл jar - это источник классов и ресурсов приложения, а не файловая система.Вы бы не пытались сохранять файлы в исполняемый файл, не так ли?

1 голос
/ 30 октября 2010

Я бы порекомендовал вам рассмотреть возможность использования двух JAR-файлов: один для хранения файлов классов вашего приложения и другой JAR-файл для хранения пользовательских данных.Если у вас нет двух отдельных JAR-файлов, у вас возникнут проблемы с получением блокировки записи из операционной системы (поскольку вы пытаетесь перезаписать JAR-файл, содержащий вашу программу, пока java ее читает).

СозданиеJAR, используйте java.util.jar.JarFile класс .Существует также другой вопрос по stackoverflow , который описывает, как создать / записать файл JAR.

1 голос
/ 30 октября 2010

Это невозможно. Однако вы можете заглянуть во встроенные базы данных для вашего варианта использования. Java 6 поставляется с JavaDB. Если вы не хотите использовать его, вы можете найти больше здесь http://java -source.net / open-source / database-engine

...