Para cargar ficheros contenidos en el .jar hay que utilizar el método Class.getResourceAsStream(String nombre). Este método devuelve un InputStream de manera que puedes leer los bytes con un InputStreamReader, un BufferedReader, o cargar un Properties.
Para obtener la clase simplemente hay que utilizar el método getClass() que posee todo objeto por heredar de Object.
El nombre del recurso puede contener una ruta. Si la dirección es relativa, se toma a partir del paquete actual (pero la ruta con ‘/’ en vez de ‘.’). Si la dirección es absoluta, se busca en el classpath y por lo tanto también en el propio jar.
Carga básica
package com.nishilua.mischorradas ; InputStream inRelativo = getClass().getResourceAsStream("archivos/archivo.txt") ; InputStream inAbsoluto = getClass().getResourceAsStream("/archivos/archivo.txt") ;
En el primer caso (línea 3) inRelativo, se carga del directorio del jar (o del classpath): /com/nishilua/mischorradas/archivos/archivo.txt
En el segundo caso (línea 4) inAbsoluto, se carga del directorio contenido en el jar (o classpath): /archivos/archivo.txt
Lectura con BufferedReader
Para leer archivos de texto tal vez prefiramos leer línea por línea, por lo que es útil la clase BufferedReader:
BufferedReader in = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/archivos/archivo.txt"))) ;
Para cargar un recurso desde la raíz del classpath (en vez desde el packete al que pertenece la clase obtenida mediante getClass()
), se ha de utilizar:
getClassLoader().getResourceAsStream() ;
Más información en los siguientes enlaces:
- http://micro-blog.chuidiang.org/content/classgetresourceasstream-vs-classloadergetresourceasstream
- http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream
Lectura de un fichero .properties
Por último, la lectura de un fichero properties mediante el método load():
Properties opciones = new Properties() ; opciones.load(getClass().getResourceAsStream("/archivos/archivo.properties")) ;