2009-07-13 25 views
11

Este problema me ha estado molestando por un tiempo. Tengo que cargar un par de archivos en mi aplicación Java, y la única manera me trabajando hasta ahora se ve así:Cargando archivos con ClassLoader

URL hsURL; 
if(System.getProperty("os.name").toLowerCase().contains("windows")) { 
    hsURL = new URL("file:/" + System.getProperty("user.dir") + "/helpsets/helpset.hs"); 
} 
else { 
    hsURL = new URL("file://" + System.getProperty("user.dir") + "/helpsets/helpset.hs"); 
} 

Pero esto es feo y terrible. Durante un tiempo pensé que tenía este trabajo:.

hsURL = ClassLoader.getSystemResource("helpsets/helpset.hs"); 

Pero eso ya no funciona por alguna razón (Debo haber cambiado algo y no lo notó devuelve null

debo utilizar getResource(). en lugar de getSystemResource() (de ser así, ¿por qué getSystemResource() static pero no getResource())?

Estoy usando eclipse y he intentado incluir la carpeta en la ruta de compilación (classpath) y no incluirla, no parece hacer la diferencia.

Respuesta

23

getSystemResource es estático porque usará el sistema clasificador de clases, que está disponible estáticamente. (ClassLoader.getSystemClassLoader)

Si su recurso está disponible en classpath, sugeriría usar ClassLoader.getResource() o Class.getResource de una clase apropiada, p.

Foo.class.getResource("/helpsets/helpset.hs"); 

(ClassLoader.getResource es "absoluta";. Class.getResource es en relación con el paquete de la clase a menos que como prefijo una '/')

Si esto no funciona, por favor, puesto cómo su aplicación está configurado en términos de la ruta de clase, y donde está tu archivo.

EDITAR: Normalmente encuentro la URL menos útil que InputStream, entonces uso getResourceAsStream en lugar de getResource. YMMV

+0

Darn.Bétame por un par de segundos – tddmonkey

+0

Si solo está interesado en los contenidos, probablemente sea mejor que use getResourceAsStream() en el ClassLoader –

+0

, aún no lo he conseguido. Estoy intentando cargar un archivo que está en un paquete diferente al de la clase desde la que lo estoy cargando, así que necesito algún tipo de referencia absoluta. – twolfe18

3

Ha mencionado varias cosas diferentes aquí, así que vamos a resolverlas.

1) La creación de un "archivo:" URL basado en "user.dir"

La propiedad "user.dir" se refiere al directorio de trabajo actual - dondequiera que el usuario podría haber sido cuando s/que comenzaron la aplicación. Es probable que los archivos escritos aquí desaparezcan entre dos ejecuciones (porque el usuario podría ejecutar desde un directorio diferente).

La propiedad "user.home" hace referencia al directorio de inicio del usuario, que debe permanecer igual entre ejecuciones.

En cualquier caso, use un objeto File para abrir archivos, no ensucie la creación de una URL "file:". No obtiene ningún beneficio, y como puede ver, tiene que escribir código desordenado para acceder a él.

2) Recuperación de un recurso a través del cargador de clases

Esto se hace para recuperar archivos que se adjuntan a la solicitud - archivos de sólo lectura. Como has visto, hay múltiples variantes. Prefiero usar lo siguiente, porque supongo que una clase querrá cargar un archivo empaquetado con él.

InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);