Как создать файл .INI для хранения некоторых настроек в Java? - PullRequest
21 голосов
/ 11 октября 2008

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

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

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

Ответы [ 6 ]

22 голосов
/ 11 октября 2008

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

Как уже отмечали другие, вы не должны записывать пользовательские настройки в каталог вашего приложения. Что делать, если у пользователя нет прав на запись в каталог приложения? Что если ваше приложение одновременно используется несколькими пользователями в одной и той же системе? Ни одна из этих ситуаций не является необычной, даже в 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 он будет расположен ниже Мои документы , поэтому пользователи не увидят каталог, если не будут искать его.

8 голосов
/ 11 октября 2008

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

1 голос
/ 19 января 2012

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

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

или это:

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

1 голос
/ 11 октября 2008

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

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

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

1 голос
/ 11 октября 2008

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

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

EDIT Свойство user.home предоставит вам каталог пользователя, который вы можете безопасно использовать.

1 голос
/ 11 октября 2008

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

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

...