2008-10-11 30 views
21

Quiero crear un archivo ini para almacenar algunas configuraciones para mi aplicación. ¿Es una buena idea encontrar dónde se encuentra el archivo jar y crear un archivo ini allí? En caso afirmativo, ¿cómo puedo encontrar la ubicación del archivo jar?¿Cómo crear un archivo .INI para almacenar algunas configuraciones en Java?

Pero si conoce una solución mejor para algo como esto, me gustaría escuchar algunos de ellos.

EDIT: Estoy usando mac y quiero ejecutar la misma aplicación en Windows. Podría escribir algo en el directorio System.getProperty ("user.home"), pero quiero mantener el sistema limpio, si el usuario decide eliminar la aplicación. ¿No hay una mejor manera de almacenar el archivo de configuración, por ejemplo, en el mismo directorio con la aplicación?

Respuesta

22

Puede ubicar el directorio de su aplicación utilizando el ClassLoader. Ver: Java: finding the application directory. En lugar de un archivo .INI, utilice un archivo .properties - puede cargarlo y guardarlo mediante la clase Properties.

Como han notado otros, no debe escribir la configuración del usuario en el directorio de la aplicación. ¿Qué pasa si el usuario no tiene acceso de escritura al directorio de la aplicación? ¿Qué ocurre si su aplicación está siendo utilizada por múltiples usuarios en el mismo sistema al mismo tiempo? Ninguna de estas situaciones es inusual, incluso en Windows.

Es posible que desee cargar algunas configuraciones desde el directorio de la aplicación; quizás el administrador haya configurado allí las configuraciones predeterminadas.

Una convención común es guardar la configuración del usuario en el directorio de inicio del usuario:

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

Aunque esto significa que usted puede dejar archivos perdidos detrás, esto puede ser beneficioso si el usuario vuelve a instalar la aplicación. Documente tales cosas en un README. Aquí es cómo crear y obtener una referencia al directorio:

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

En los sistemas operativos tipo Unix, a partir del nombre de directorio con un punto (".myappdir") hará que el directorio oculto. En Windows, se ubicará debajo de Mis documentos, por lo que los usuarios no verán el directorio a menos que lo busquen.

1

No debe almacenar archivos temporales en el directorio de instalación de una aplicación. Recuerde, el usuario que ejecuta la aplicación puede no tener acceso de escritura a ese directorio. El lugar más seguro para poner cosas así es en la carpeta C: \ Documents and Settings \ username \ Application Data \ ApplicationName (ajustando el nombre según sea necesario).

Dicho esto, sin embargo, probablemente almacenara ese tipo de cosas en el registro en lugar de un archivo en su computadora. (Pero, eso soy yo solo)

+0

y lo que sobre la ejecución de la misma aplicación en MacOS ?? Y estoy totalmente de acuerdo con este artículo ... http://www.codinghorror.com/blog/archives/000939.html Así que creo que el registro no es una buena idea :) – Lipis

1

Depende de si su ini necesita ser legible/escribible por el ser humano en circunstancias normales. De lo contrario, puede usar un archivo de propiedades en lugar de un archivo ini, y almacenarlo en el directorio "usuario".

En cuanto a encontrar el archivo JAR, usted tiene que encontrar el cargador de clases de una clase conocida para ser cargado desde el frasco, compruebe que era el tipo apropiado de cargador de clases (es decir, que es realmente han cargado de un frasco), y puedes extraer el camino de eso. Probablemente pueda desenterrar el código para hacer esto si eso es realmente lo que quieres. No necesariamente lo recomendaría.

EDIT La propiedad user.home le dará el directorio de usuario, que puede usar con seguridad.

+0

user.dir te da el directorio de trabajo actual , que puede no ser seguro o apropiado. user.home le proporciona el directorio de inicio del usuario. –

+0

¿Es seguro asumir que la propiedad 'user.home' le da un valor apropiado para cada entorno? Es decir,/home/{user} en * nix, el subdirectorio Documents and Settings relevante para Windows, etc. – Andrew

+0

Eso es lo que se supone que 'user.home' debe hacer. –

1

Normalmente, los programadores de Java no usan archivos .ini, sino archivos .properties (formato diferente). Puedes usar la clase java.lang.Properties como un buen envoltorio programático si lo haces.

Mientras que usted puede obtener la ubicación de su archivo jar llamando getProtectionDomain(). GetCodeSource(). GetLocation() en el miembro .class de su clase, no recomiendan que lo haga.

En su lugar, escribiría el archivo en el directorio System.getProperty ("usuario.casa") - el directorio de inicio de los usuarios, o si es realmente temporal, System.getProperty ("java.io.tmpdir")

+0

Hmm ... Soy un novato en Java, así que sí .properties es una mejor idea. Pero, ¿dónde almacena su configuración cuando está escribiendo una aplicación en Java? Estoy usando Mac, pero también quiero ejecutarlo en un entorno de Windows. – Lipis

8

Si las configuraciones solo las escribe su aplicación (en lugar de editarlas manualmente), considere usar el Preferences API.

Cuestiones relacionadas