2010-09-16 22 views
11

Necesito leer un archivo en mi código. Es físicamente reside aquí:¿Cómo hago referencia a un recurso en Java?

C:\eclipseWorkspace\ProjectA\src\com\company\somePackage\MyFile.txt 

lo he puesto en un paquete fuente, de manera que cuando se crea un archivo jar ejecutable (Exportar-> archivo JAR Ejecutable) que se incluye en el frasco. Originalmente lo tenía en la raíz del proyecto (y también probé una subcarpeta normal), pero la exportación no lo incluía en el contenedor.

Si en mi código que hago:

File myFile = new File("com\\company\\somePackage\\MyFile.txt"); 

el archivo jar localiza correctamente el archivo, pero que se ejecutan localmente (Run As-> aplicación Java Principal) lanza un archivo no encontrado una excepción, ya que espera que sea :

File myFile = new File("src\\com\\company\\somePackage\\MyFile.txt"); 

Pero esto falla en mi archivo jar. Entonces mi pregunta es, ¿cómo hago que este concepto funcione para ambos ejecutarse localmente y en mi archivo jar?

Respuesta

33

Use ClassLoader.getResourceAsStream o Class.getResourceAsStream. La principal diferencia entre los dos es que la versión ClassLoader siempre usa una ruta "absoluta" (dentro del archivo jar o lo que sea) mientras que la versión Class es relativa a la clase misma, a menos que prefija la ruta con /.

Así que si usted tiene una clase com.company.somePackage.SomeClass y com.company.other.AnyClass (dentro de un mismo cargador de clases como el recurso) se puede utilizar:

SomeClass.class.getResourceAsStream("MyFile.txt") 

o

AnyClass.class.getClassLoader() 
       .getResourceAsStream("com/company/somePackage/MyFile.txt"); 

o

AnyClass.class.getResourceAsStream("/com/company/somePackage/MyFile.txt"); 
0

Si He colocado i archivo en un archivo jar, solo funcionó si y solo si usé

...getResourceAsStream("com/company/somePackage/MyFile.txt") 

Si utilicé un objeto File nunca funcionó. Obtuve también la excepción FileNotFound. Ahora, me quedo con el objeto InputStream.

Cuestiones relacionadas