2008-10-11 9 views
21

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

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

EDIT: Я использую mac, и я хочу запустить одно и то же приложение в окнах. Я мог бы написать что-то в каталоге System.getProperty («user.home»), но я хочу, чтобы система была чистой, если пользователь решил удалить приложение. Нет лучшего способа сохранить файл настроек, например, в том же каталоге с приложением?

ответ

22

Вы можете найти каталог своего приложения, используя ClassLoader. См .: Java: finding the application directory. Вместо файла .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 он будет расположен ниже Мои документы, поэтому пользователи не будут видеть каталог, если они не ищут его.

1

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

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

+0

и что о запуске того же приложения в MacOS ?? И я полностью согласен с этой статьей. Http://www.codinghorror.com/blog/archives/000939.html Так что я считаю, что реестр - это не очень хорошая идея :) – Lipis 2008-10-11 00:52:17

1

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

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

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

+0

user.dir дает вам текущий рабочий каталог , которые могут быть небезопасными или подходящими. user.home предоставляет домашний каталог пользователя. – 2008-10-11 00:48:10

+0

Можно ли предположить, что свойство user.home дает вам соответствующее значение для каждой среды? То есть,/home/{user} в * nix, соответствующий подкаталог Documents and Settings для Windows и т. Д.? – Andrew 2008-10-11 02:10:02

1

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

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

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

8

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