Как создать файл .INI для хранения некоторых настроек в Java?

StackOverflow https://stackoverflow.com/questions/193474

Вопрос

Я хочу создать INI-файл, чтобы сохранить некоторые настройки для моего приложения. Это хорошая идея, чтобы найти, где находится JAR-файл и создать INI-файл там? Если да, то как я могу найти местоположение файла JAR?

Но если вы знаете лучшее решение для чего-то подобного, я хотел бы услышать некоторые из них.

РЕДАКТИРОВАТЬ . Я использую Mac и хочу запустить одно и то же приложение в Windows. Я мог бы написать что-нибудь в каталоге System.getProperty (" user.home "), но я хочу сохранить систему в чистоте, если пользователь решит удалить приложение. Нет лучшего способа сохранить файл настроек, например, в одном каталоге с приложением?

Это было полезно?

Решение

Вы можете найти каталог приложения, используя ClassLoader. См. Java: поиск каталога приложения . Вместо файла .INI используйте файл .properties - вы можете загрузить и сохранить его через свойства class.

Как уже отмечали другие, вы не должны записывать пользовательские настройки в каталог вашего приложения. Что делать, если у пользователя нет прав на запись в каталог приложения? Что если ваше приложение одновременно используется несколькими пользователями в одной и той же системе? Ни одна из этих ситуаций не является необычной, даже в Windows.

Возможно, вы все равно захотите загрузить некоторые настройки из каталога приложения - возможно, администратор настроил там настройки по умолчанию.

Общепринятым условием является сохранение настроек пользователя в домашнем каталоге пользователя:

/home/user/.eclipse
C:\Documents and Settings\User\.eclipse

Хотя это означает, что вы можете оставить чужие файлы, это может быть полезно, если пользователь переустанавливает приложение. Документируйте такие вещи в README. Вот как создать и получить ссылку на каталог:

public static File getSettingsDirectory() {
    String userHome = System.getProperty("user.home");
    if(userHome == null) {
        throw new IllegalStateException("user.home==null");
    }
    File home = new File(userHome);
    File settingsDirectory = new File(home, ".myappdir");
    if(!settingsDirectory.exists()) {
        if(!settingsDirectory.mkdir()) {
            throw new IllegalStateException(settingsDirectory.toString());
        }
    }
    return settingsDirectory;
}

В Unix-подобных операционных системах запуск имени каталога с точкой (" .myappdir ") сделает каталог скрытым. В Windows он будет расположен ниже Мои документы , поэтому пользователи не увидят каталог, если не будут его искать.

Другие советы

Если настройки пишутся только вашим приложением (а не редактируются вручную), рассмотрите возможность использования API настроек .

Вы не должны хранить временные файлы в каталоге установки приложения. Помните, что пользователь, запускающий приложение, может не иметь права на запись в этот каталог. Самое безопасное место для размещения подобных вещей - папка C: \ Documents and Settings \ username \ Application Data \ ApplicationName (при необходимости изменив имя).

Тем не менее, я бы, вероятно, сохранил такие вещи в реестре, а не на их компьютере. (Но это только я.)

Обычно Java-программисты используют не файлы .ini, а файлы .properties (другой формат). Вы можете использовать класс java.lang.Properties как хорошую программную оболочку, если вы это сделаете.

В то время как вы можете получить местоположение вашего файла jar, вызвав getProtectionDomain (). getCodeSource (). getLocation () для члена вашего класса .class, я не Рекомендую вам сделать это.

Я бы вместо этого записал файл в каталог System.getProperty (" user.home ") - домашний каталог пользователя или, если он действительно временный, System.getProperty (" java.io.tmpdir ")

Это зависит от того, должен ли ваш ini-файл быть читаемым / записываемым человеком при нормальных обстоятельствах. Если нет, вы можете использовать файл свойств, а не INI-файл, и сохранить его в " пользовательском " каталог.

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

РЕДАКТИРОВАТЬ Свойство user.home предоставит вам каталог пользователя, который вы можете безопасно использовать.

Идея с файлом .properties вместо файла INI хороша. Кроме того, если вы храните там некоторые конфиденциальные данные, вы можете зашифровать их. Проверьте это:

https://www.owasp.org/index.php/How_to_encrypt_a_proaties

или это:

шифровать и дешифровать значение файла свойств в java

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top