2008-10-11 8 views
21

Je souhaite créer un fichier ini pour stocker certains paramètres pour mon application. Est-ce une bonne idée de trouver où le fichier jar est situé et créer un fichier ini là-bas? Si oui, alors comment puis-je trouver l'emplacement du fichier jar?Comment créer un fichier .ini pour stocker certains paramètres en Java?

Mais si vous connaissez une meilleure solution pour quelque chose comme ça, j'aimerais en entendre quelques-uns.

EDIT: J'utilise mac et je veux exécuter la même application dans Windows. Je pourrais écrire quelque chose dans le répertoire System.getProperty ("user.home"), mais je veux garder le système propre, si l'utilisateur décide de supprimer l'application. Il n'y a pas une meilleure façon de stocker le fichier de paramètres, par exemple dans le même répertoire avec l'application?

Répondre

22

Vous pouvez trouver le répertoire de votre application en utilisant le ClassLoader. Voir: Java: finding the application directory. Plutôt qu'un fichier .INI, utilisez un fichier .properties - vous pouvez le charger et le sauvegarder via la classe Properties.

Comme d'autres l'ont noté, vous ne devez pas écrire les paramètres utilisateur dans le répertoire de votre application. Que faire si l'utilisateur n'a pas accès en écriture au répertoire de l'application? Que faire si votre application est utilisée par plusieurs utilisateurs sur le même système en même temps? Aucune de ces situations ne sont inhabituelles, même sur Windows.

Vous pouvez toujours vouloir charger certains paramètres à partir du répertoire de l'application - l'administrateur a peut-être configuré les paramètres par défaut.

Une convention commune est d'enregistrer les paramètres de l'utilisateur dans le répertoire de l'utilisateur:

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

Bien que cela signifie que vous pourriez laisser des fichiers parasites derrière, cela peut être bénéfique si l'utilisateur réinstalle l'application. Documentez ces choses dans un fichier README. Voici comment créer et obtenir une référence au répertoire:

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; 
} 

Sur les systèmes d'exploitation Unix, en commençant le nom du répertoire avec une période (« .myappdir ») fera le répertoire caché. Sous Windows, il sera situé sous Mes Documents, de sorte que les utilisateurs ne verront pas le répertoire à moins qu'ils ne le recherchent.

1

Vous ne devriez pas stocker de fichiers temporaires dans le répertoire d'installation d'une application. N'oubliez pas que l'utilisateur qui exécute l'application peut ne pas avoir accès en écriture à ce répertoire. L'endroit le plus sûr pour mettre ce genre de choses est dans le dossier C: \ Documents and Settings \ nom_utilisateur \ Application Data \ ApplicationName (en ajustant le nom si nécessaire). Cela dit, cependant, je stockerais probablement ce type de choses dans le registre au lieu d'un fichier sur leur ordinateur. (Mais, c'est juste moi.)

+0

et que sur l'exécution de la même application dans Mac OS ?? Et je suis totalement d'accord avec cet article .. http://www.codinghorror.com/blog/archives/000939.html Donc, je pense que le registre n'est pas une bonne idée du tout :) – Lipis

1

Cela dépend si votre ini doit être lisible/inscriptible par l'homme dans des circonstances normales. Sinon, vous pouvez utiliser un fichier de propriétés plutôt qu'un fichier ini et le stocker dans le répertoire "utilisateur".

Quant à trouver le fichier jar, vous devez trouver le ClassLoader pour une classe connue pour être chargé à partir du pot, vérifiez qu'il était le type approprié de ClassLoader (à savoir que c'est vraiment été chargé d'un pot), et vous pouvez extraire le chemin à partir de cela. Je peux probablement déterrer le code pour le faire si c'est vraiment ce que vous voulez. Je ne le recommanderais pas nécessairement.

EDIT La propriété user.home vous donnera le répertoire utilisateur, que vous pouvez utiliser en toute sécurité.

+0

user.dir vous donne le répertoire de travail en cours , ce qui peut ne pas être sûr ou approprié. user.home vous donne le répertoire personnel de l'utilisateur. –

+0

Est-il prudent de supposer que la propriété 'user.home' vous donne une valeur appropriée pour chaque environnement? C'est-à-dire,/home/{user} sur * nix, le sous-répertoire Documents and Settings correspondant pour Windows, etc? – Andrew

+0

C'est ce que 'user.home' est censé faire. –

1

Typiquement, les programmeurs Java n'utilisent pas les fichiers .ini, mais les fichiers .properties (format différent). Vous pouvez utiliser la classe java.lang.Properties comme une belle enveloppe programmatique si vous le faites.

Pendant que vous peut obtenir l'emplacement de votre fichier jar en appelant getProtectionDomain sur membre .class de votre classe(). GetCodeSource(). GetLocation(), je ne recommande pas que vous faites cela. J'écrirais plutôt le fichier dans le répertoire System.getProperty ("user.home") - le répertoire de base des utilisateurs, ou s'il est vraiment temporaire, System.getProperty ("java.io.tmpdir")

+0

Hmm ... Je suis un noob en Java, donc oui .properties est une meilleure idée. Mais où stockez-vous vos paramètres, lorsque vous écrivez une application en Java. J'utilise Mac, mais je veux aussi l'utiliser dans un environnement Windows. – Lipis

8

Si les paramètres sont uniquement écrits par votre application (plutôt que modifiés manuellement), utilisez le Preferences API.

Questions connexes