2009-10-12 17 views
7

¿Es posible para Desktop.open(File f) hacer referencia a un archivo ubicado dentro de un JAR?Java Desktop.open (archivo f) archivo de referencia dentro de JAR?

Intenté usar ClassLoader.getResource(String s), convirtiéndolo en un URI, y luego creando un archivo a partir de él. Pero esto da como resultado IllegalArgumentException: URI is not hierarchical.

URL url = ClassLoader.getSystemClassLoader().getResource(...); 
System.out.println("url=" + url); // url is valid 
Desktop.getDesktop().open(new File(url.toURI())); 

Una posibilidad es the answer at JavaRanch, que consiste en crear un archivo temporal del recurso dentro del JAR - no muy elegante.

Esto se ejecuta en Windows XP.

+1

En realidad, la creación de un archivo temporal es una buena solución. Puede crear una biblioteca "elegante" para eso, para que no tenga que codificarlo cada vez. – OscarRyz

Respuesta

6

"Archivos" dentro de archivos .jar no son archivos para el sistema operativo. Son solo un área del archivo .jar y generalmente están comprimidos. No son direccionables como archivos separados por el sistema operativo y, por lo tanto, no se pueden mostrar de esta manera.

Java en sí tiene una manera ordenada de referirse a esos archivos por parte de un URI (como se dio cuenta usando getResource()) pero eso es completamente específico de Java.

Si quieres algo de aplicación externa para acceder a ese archivo, que tienes dos soluciones posibles:

  1. proporcionar alguna forma estandarizada para acceder al archivo o
  2. Hacer la aplicación capaz de hacer frente a los archivos que se encuentran embalado en un archivo .jar (o .zip).

Generalmente 2 no es realmente una opción (a menos que la otra aplicación también esté escrita en Java, en cuyo caso es bastante fácil).

La opción 1 generalmente se realiza simplemente escribiendo en un archivo temporal y refiriéndose a eso. Alternativamente, puede iniciar un pequeño servidor web y proporcionar el archivo a través de alguna URL.

+0

De hecho, tengo un servidor web (Jetty) incrustado en la aplicación. Entonces el problema es que Desktop.browse (URI) solo lanzará un navegador y no una aplicación. –

+1

@Kuo: sí, me di cuenta de que preguntaste sobre open() después de agregar mi edición. Por supuesto, para open() solo la solución de archivos temporales es útil. –

3

Un recurso dentro de un archivo jar simplemente no es un archivo, por lo que no puede usar un File para acceder a él. Si está utilizando algo que realmente necesita un archivo, de hecho tendrá que crear un archivo temporal y abrirlo en su lugar.

1

Pero una entrada en un archivo JAR es no es File! El archivo JAR es un archivo; sus entradas son entradas de archivo JAR (para indicar lo obvio).

Java contiene abstracciones que significan que no es necesario que trabaje con File s. ¿Por qué no utilizar o InputStream para encapsular la entrada?

0

No, no lo es, porque a medida que simplemente es testigo de que no tiene un archivo válido en primer lugar

Desde el artículo: Using the Desktop API in Java SE 6 conseguimos

ABIERTA: representa una acción abierta realizada por una aplicación asociada a la apertura de un tipo de archivo específico

Así que usted tendría que tener un válido archivo y luego tener una aplicación asociada con ese archivo para que el sistema operativo pueda abrirlo.Si bien tal aplicación puede existir, usted todavía tiene que hacer que comprenda la URL de su archivo.

Cuestiones relacionadas