2010-08-10 31 views
12

estoy usando Resource abstracción de primavera para trabajar con recursos (archivos) en el sistema de archivos. Uno de los recursos es un archivo dentro de un archivo JAR. De acuerdo con el siguiente código, parece que la referencia es válidaobtener el archivo JAR desde

ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); 

// The path to the resource from the root of the JAR file 
Resource fileInJar = resourcePatternResolver.getResources("/META-INF/foo/file.txt"); 

templateResource.exists(); // returns true 
templateResource.isReadable(); // returns true 

En este punto, todo está bien, pero luego cuando intento convertir el Resource a un File

templateResource.getFile(); 

tengo la excepción

java.io.FileNotFoundException: class path resource [META-INF/foo/file.txt] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:/m2repo/uic-3.2.6-0.jar!/META-INF/foo/file.txt   
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:198) 
at org.springframework.core.io.ClassPathResource.getFile(ClassPathResource.java:174) 

Cuál es la forma correcta para obtener una referencia a un FileResource que existe dentro de un archivo JAR?

Respuesta

4

Si quieres leerlo, simplemente llame resource.getInputStream()

El mensaje de excepción es bastante claro - el archivo no residir en el sistema de archivos, por lo que no se puede tener una instancia File. Además, ¿qué va a hacer con ese File, además de leer su contenido?

+0

que me dará un InputStream, pero lo que realmente quiero es un archivo –

+0

¿qué vas a hacer con ese 'File'? – Bozho

+1

Pásalo a una API que requiera un archivo –

17

Cuál es la forma correcta para obtener una referencia del archivo a un recurso que existe dentro de un archivo JAR?

La forma correcta no es hacer eso en absoluto porque es imposible. Un File representa un archivo real en un sistema de archivos, que una entrada JAR no lo es, a menos que tenga un sistema de archivos especial para eso.

Si sólo necesita los datos, utilice getInputStream(). Si usted tiene que satisfacer una API que exige un objeto File, entonces me temo que lo único que puede hacer es crear un archivo temporal y copiar los datos del flujo de entrada a la misma.

+0

¿Puedes mostrar un ejemplo con getInputStream() por favor? –

+1

@David Williams: simplemente llame a getInputStream() en lugar de getFile() –

-1

Un rápido vistazo a la link que ya ha proporcionado para la documentación de recursos, dice lo siguiente:

Throws: IOException if the resource cannot be resolved as absolute file path, 
i.e. if the resource is not available in a file system 

Tal vez el archivo de texto está dentro de un frasco? En ese caso, deberá usar getInputStream() para leer su contenido.

-1

Simplemente añadiendo un ejemplo de las respuestas aquí. Si necesita un File (y no sólo los contenidos de la misma) desde dentro de su JAR, es necesario crear un archivo temporal desde el primer recurso. (La continuación está escrito en Groovy):

InputStream inputStream = resourceLoader.getResource('/META-INF/foo/file.txt').inputStream 
    File tempFile = new File('file.txt') 
    OutputStream outputStream = new FileOutputStream(tempFile) 

    try { 
     IOUtils.copy(inputStream, outputStream) 
    } catch (IOException e) { 
     // Handle exception 
    } finally { 
     outputStream.close() 
    } 
Cuestiones relacionadas