2009-10-12 18 views
7

È possibile per Desktop.open(File f) fare riferimento a un file che si trova all'interno di un JAR?Java Desktop.open (File f) file di riferimento all'interno di JAR?

Ho provato a utilizzare ClassLoader.getResource(String s), convertendolo in un URI, quindi creando un file da esso. Ma questo si traduce in 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 possibilità è the answer at JavaRanch, che è quello di creare un file temporaneo dalla risorsa all'interno della JAR - non molto elegante.

Questo è in esecuzione su Windows XP.

+1

In realtà la creazione di un file temporaneo è una buona soluzione. Puoi creare una libreria "elegante" per questo, quindi non devi codificarla ogni volta. – OscarRyz

risposta

6

I "file" all'interno dei file .jar non sono file del sistema operativo. Sono solo alcune aree del file .jar e di solito sono compresse. Non sono indirizzabili come file separati dal sistema operativo e pertanto non possono essere visualizzati in questo modo.

Java stesso ha un modo pulito di riferirsi a quei file con qualche URI (come hai capito usando getResource()) ma è interamente specifico di Java.

Se volete qualche applicazione esterna per accedere quel file, hai due possibili soluzioni:

  1. fornire qualche modo standardizzato per accedere al file o
  2. rendere l'applicazione in grado di affrontare i file che sono imballato in un file .jar (o .zip).

Generalmente 2 non è un'opzione valida (a meno che l'altra applicazione non sia scritta anche in Java, nel qual caso è piuttosto semplice).

L'opzione 1 viene in genere eseguita semplicemente scrivendo in un file temporaneo e facendo riferimento a ciò. In alternativa è possibile avviare un piccolo server Web e fornire il file tramite un URL.

+0

In realtà ho un server Web (Jetty) incorporato nell'applicazione. Quindi il problema è Desktop.browse (URI) avvierà solo un browser e non un'applicazione. –

+1

@Kuo: sì, mi sono reso conto che hai chiesto di aprire() dopo aver aggiunto la mia modifica. Ovviamente per open() solo la soluzione di file temporanei è utile. –

3

Una risorsa all'interno di un file jar semplicemente non è un file - quindi non è possibile utilizzare uno File per raggiungerlo. Se stai usando qualcosa che ha davvero bisogno di un file, dovrai creare un file temporaneo e aprirlo.

1

Ma una voce in un file JAR è non uno File! Il file JAR è un file; le sue voci sono voci del file JAR (per dichiarare l'ovvio).

Java contiene astrazioni che significano che non è necessario necessariamente lavorare con File s - perché non utilizzare uno Reader o InputStream per incapsulare l'input?

0

No, non lo è, perché, come si solo testimone non si dispone di un file valido al primo posto

Dall'articolo: Using the Desktop API in Java SE 6 abbiamo ottenuto

APERTO: rappresenta un azione aperta eseguita da un'applicazione associata all'apertura di un tipo di file specifico

Quindi si dovrebbe avere un valido file e quindi avere un'applicazione associata a quel file in modo che il sistema operativo possa aprirlo.Mentre tale app può esistere devi ancora far capire l'URL del tuo file.